luodaoyi

链表
实现思想 :通过指针把要元素串起来简单结构图struct Student { char name[10];...
扫描右侧二维码阅读全文
25
2018/01

链表

实现思想 :通过指针把要元素串起来

简单结构图

struct Student
{
    char name[10];
    int score;
}

struct Node
{
    Student Element;
    Node* next;
}

每一个节点包含此节点信息和下一个节点的指针

有点:插入删除方便
缺点:查找麻烦

基本元素实现

//方法/函数
int InitList();//初始化链表
int IsEmpty(); //判断链表是否为空 空返回1 非空0
void Clear(Node* p);   //清空链表
ini Find(int Index,Student* element); //根据索引获取元素
int Insert(int Index,Student* Element);//根据索引新增元素
int Delete(int Index,Student* Element);//根据索引删除元素

int GetSize();//获取链表中元素的数量

//属性/变量
Node* m_pHead;  //链表头指针,指向第一个节点
Node* m_pEnd;   //链表尾指针,指向最后一个节点
int m_dwLength;    //元素的数量

链表简单实现


// _20180125.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <stdio.h>
#include <windows.h>

struct Student
{
    char name[10];
    int id;
    int achievement;
};

struct Node
{
    Student Element;
    Node* next;
};


//初始化链表
Node* InitList()
{
    int len;
    printf("输入链表长度 \n");
    scanf("%d",&len);
    
    Node* pHead = (Node*)malloc(sizeof(Node));
    pHead->next=NULL;
    Node* pEnd = pHead ;//pEnd 永远指向尾节点的指针

    for (int i =0;i<len;i++)
    {
        //赋值过程
        printf("录入第 %d 个元素",i+1);
        Node* pNew = (Node*)malloc(sizeof(Node));
        printf("输入学生姓名:");
        scanf("%s",&(pNew->Element.name));
        printf("\n输入学生id:");
        scanf("%d",&(pNew->Element.id));
        printf("\n输入学生成绩");
        scanf("%d",&(pNew->Element.achievement));
        pNew->next=NULL;

        pEnd->next=pNew;//从把之前的最后一个元素的next指向刚才新建的元素
        pEnd=pNew;//重新把pEnd赋值为最后一个元素
    }
    return pHead;

}

//判断链表是否为空 空返回1 非空0
int IsEmpty(Node* pHead)
{
    if(NULL==pHead->next)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}

 //清空链表
void Clear(Node* pHead)
{
    if(NULL!=pHead->next){
        Clear(pHead->next);
    }
    free(pHead);
}

//根据索引获取元素
Student* Find(Node* pHead,int Index)
{
    Node* pTmp=pHead->next;
    for (int i=0;i<Index;i++)
    {
        if(NULL == pTmp->next)
        {
            printf("插入位置不合法\n");
            return NULL;
        }
        pTmp=pTmp->next;
    }
    return &(pTmp->Element);
}

//根据索引新增元素
int Insert(Node* pHead,int Index,Student* Element)
{
    Node* pTmp = pHead->next;
    Node* pNext;
    for (int i=0;i<Index;i++)
    {
        if(NULL == pTmp->next)
        {
            printf("插入位置不合法\n");
            return 0;
        }
        pTmp=pTmp->next;
    }
    pNext = pTmp->next;

    //插入新元素
    Node* pNew = (Node*)malloc(sizeof(Node));
    
    strcpy(pNew->Element.name,Element->name);
    pNew->Element.id=Element->id;
    pNew->Element.achievement=Element->achievement;
        
    pNew->next=pNext;
    pTmp->next=pNew;
    
    return 1;
}

//根据索引删除元素
int Delete(Node* pHead,int Index,Student* Element)
{
    Node* pTmp = pHead->next;
    Node* pDel;

    for (int i =0;i<Index-1;i++)
    {
        if(NULL == pTmp->next)
        {
            printf("删除位置不合法\n");
            return 0;
        }
        pTmp=pTmp->next;
    }
    //此时 pTmp是上一个节点
    pDel = pTmp->next; //这里是要删除的节点
    pTmp->next=pDel->next;
    free(pDel);
    return 1;
}

//获取链表中元素的数量
int GetSize(Node* pHead)
{
    int num =0;
    Node* pTmp = pHead->next;
    while (pTmp!=NULL)
    {
        num++;
        pTmp=pTmp->next;
    }
    return num;
}


int main(int argc, char* argv[])
{
    Node* pHead= InitList();
    Student* s ;
    if(IsEmpty(pHead))
    {
        printf("链表为空");
    }
    int length = GetSize(pHead);
    printf("链表长度 %d",length);
    s =Find(pHead,1);
    Insert(pHead,2,s);
    Clear(pHead);
    
    s=NULL;
    pHead=NULL;
    return 0;
}
Last modification:January 26th, 2018 at 11:21 am
If you think my article is useful to you, please feel free to appreciate

Leave a Comment