欢迎光临散文网 会员登陆 & 注册

链表的完整操作

2023-06-04 14:22 作者:夏师傅ber  | 我要投稿

第一次写链表 #include #include #define K 20 //定义K为链表的最大长度  typedef struct lnode //此处一定要有结构体名  { int number; struct lnode* pNext; //此处的成员名至关重要 ,即此处的stu  }*Link,Node; //同时应该再定义node类型  //创建头节点  Link CreateHead() { Link LinkHead=(Link)malloc(sizeof(Node));//此时sizeof后面应该跟Node,而不是原先的Link  LinkHead->number=0; //应该定义这个头节点的数据,这一行是原先无的,其实也可以不定义  LinkHead->pNext=NULL;  return LinkHead; } //头插法初始化链表  Link HeadInitLink(Link HeadPtr,int length) { int i; printf("请逆序依次输入值,输入-1退出赋值\n"); Link ptemp=HeadPtr; //保存头结点便于返回  for(i=0;inumber); //注意scanf都要加 & 这个符号  if(Ls->number==-1) //加入退出的条件  { break; }  //将新节点插入到链表头部  Ls->pNext=ptemp->pNext; //此处应该理解为将ptemp的next域空指针赋值给Ls的pNext域, //而不是之前理解的“指向”  ptemp->pNext=Ls; /¼emp=Ls; //printf("%d\n",Ls->number); } printf("当前链表长度为%d\n",i); //return HeadPtr; //return i;  } //尾插法初始化链表  Link TailInitLink(Link HeadPtr,int length) { int i; Link ptemp=(Link)malloc(sizeof(Link)); ptemp=HeadPtr; printf("请正序依次输入值,输入-1退出赋值\n"); for(i=0;inumber); if(Ln->number==-1) //加入退出的条件  { Ln->pNext=NULL; //将此处指针的next域置空  break; }  ptemp->pNext=Ln; Ln->pNext=NULL; ptemp=Ln; } printf("当前链表长度为%d\n",i); //return HeadPtr; } //遍历 void Display(Link HeadPtr)  { Link ptemp=HeadPtr->pNext; while(ptemp!=NULL) { printf("%d\n",ptemp->number); ptemp=ptemp->pNext; } } //查找与取值 LinkRetab(Link HeadPtr,int a) { Link ptemp=HeadPtr->pNext; int i; for(i=1;i<=K;i++) { if(ptemp->number==a||!ptemp) { printf("%d\n",ptemp->number); printf("查找的数据所在位置为%d\n",i);  break; } else { ptemp=ptemp->pNext; if(ptemp==NULL) { printf("未查找到数据,您输入的数据不在链表里\n"); } } } } //插入元素  void LinkInsert(Link HeadPtr,int place,int m) { Link newnode=(Link)malloc(sizeof(Node)); Link ptemp=HeadPtr; int i; newnode->number=m; for(i=1;i<=K;i++) { ptemp=ptemp->pNext; if(i==place) { newnode->pNext=ptemp->pNext; ptemp->pNext=newnode; break; } if(!ptemp){ break;} } } //删除 //终于来到了最后一个函数 void DeleteNode(Link HeadPtr,int place) { Link ptemp=HeadPtr; Link paft=ptemp->pNext; int i=0; while(paft!=NULL) { ptemp=ptemp->pNext; paft =paft ->pNext; i++;  if(i==place) { ptemp->pNext=paft->pNext; free(paft); paft=ptemp->pNext; } }  }  int main() { int a,b,c,d,e; //使用函数创建头节点 Link NewHead=CreateHead(); //选择头插或尾插法创建链表   printf("请选择使用头插法(输入1)还是尾插法(输入0)创建链表"); scanf("%d",&a); if(a==0) { TailInitLink(NewHead,K);} else if(a==1) { HeadInitLink(NewHead,K);} else { printf("输入有误\n"); return 1;} //遍历单链表  Display(NewHead); //返回单链表的值和位置  printf("请输入要返回的元素\n"); scanf("%d",&b); LinkRetab(NewHead,b); //在特定位置插入节点和值 printf("请输入要插入元素的位置和要插入的值\n"); scanf("%d",&c); scanf("%d",&d); printf("重新遍历\n"); LinkInsert(NewHead,c-1,d); Display(NewHead); //删除节点和元素 printf("请输入要删除的节点\n"); scanf("%d",&e); DeleteNode(NewHead,e-1); printf("再次遍历\n"); Display(NewHead); return 0; }

链表的完整操作的评论 (共 条)

分享到微博请遵守国家法律