链表

  • A+
所属分类:Asura笔记本
摘要

每一个节点包含此节点信息和下一个节点的指针有点:插入删除方便
缺点:查找麻烦


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

链表

简单结构图

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; } 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: