4487浏览
查看: 4487|回复: 5

[教程] 单链表的创建以及操作

[复制链接]
  1. /*************************单链表的创建以及使用**********************************/
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. /********************单链表******************************/
  5. struct linknode /*链表结构声明*/
  6. {
  7.   int data; /*存储结点数据*/
  8.   struct linknode *next; /*指向下一个结点*/
  9. };
  10. typedef struct linknode LinkNode; /*定义新类型*/
  11. /***********************单链表的创建***************************/
  12. LinkNode *CreatLinkNode() /*链表的创建*/
  13. {
  14.   int i;
  15.   LinkNode *head,*ptr,*p; /*链表结点*/
  16.   head = (LinkNode *) malloc(sizeof(LinkNode)); /*分配内存*/
  17.   if(!head) /*检查指针内存是否分配成功*/
  18.   {
  19.     printf("内存分配失败!\n");
  20.     exit(1); /*退出*/
  21.   }
  22.   printf("请输入第1个数据:");
  23.   scanf("%d",&head->data ); /*创建结点内容*/
  24.   head->next=NULL; /*设置指针初值*/
  25.   ptr=head; /*ptr指向链表开始*/
  26.   for(i=1;i<5;i++) /*循环创建结点*/
  27.   {
  28.     p=(LinkNode *) malloc(sizeof(LinkNode));
  29.     if(!p)
  30.     {
  31.       printf("内存分配失败!\n");
  32.       exit(1);
  33.     }
  34.     printf("请输入第%d个数据:",i+1);
  35.     scanf("%d",&p->data );
  36.     p->next=NULL;
  37.     ptr->next = p; /*连接结点*/
  38.     ptr=ptr->next; /*指向下一个结点*/
  39.   }
  40.   return head;
  41. }
  42. /***********************单链表遍历***************************/
  43. LinkNode *FindNode(LinkNode *head, int num) /*链表的遍历*/
  44. {
  45.   LinkNode *ptr;
  46.   ptr=head; /*指向链表起始*/
  47.   while(ptr!=NULL) /*遍历链表*/
  48.   {
  49.     if(ptr->data == num)  return ptr; /*查找编号*/
  50.     ptr=ptr->next ; /*指向一下结点*/
  51.   }
  52.   return ptr;
  53. }
  54. /************************单链表的插入**************************/
  55. LinkNode *InsertNode(LinkNode *head,LinkNode *ptr,int vlaue) /*链表结点的插入*/
  56. {
  57.   LinkNode *newnode=(LinkNode *)malloc(sizeof(LinkNode)); /*分配内存*/
  58.   if(!newnode)  return NULL;
  59.   newnode->data=vlaue; /*创建结点内容*/
  60.   newnode->next=NULL; /*设置指针初值*/
  61.   if(ptr==NULL)
  62.   {
  63.     newnode->next=head; /*新结点称为链表开始*/
  64.     return newnode;
  65.   }
  66.   else
  67.   {
  68.     if(ptr->next == NULL)  ptr->next = newnode; /*是否是链表结束指向新结点*/
  69.     else
  70.     {
  71.       newnode->next=ptr->next; /*新结点指向下一个结点*/
  72.       ptr->next=newnode; /*结点ptr指向新结点*/
  73.     }
  74.   }
  75.   return head;
  76. }
  77. /************************单链表的删除**************************/
  78. LinkNode *DeleteNode(LinkNode *head,LinkNode *ptr)  /*链表结点删除*/
  79. {
  80.   LinkNode *pre; /*指向前一结点*/
  81.   if(ptr==head) /*是否是链表的开始*/
  82.     return head->next; /*输出第二个结点*/
  83.   else
  84.   {
  85.     pre=head;
  86.     while(pre->next !=ptr) /*找结点ptr的前结点*/
  87.       pre=pre->next;
  88.     if(ptr->next ==NULL) /*是否是链表的结束*/
  89.       pre->next = NULL; /*最后一个结点*/
  90.     else
  91.       pre->next = ptr->next ; /*中间结点*/
  92.   }
  93.   free(ptr); /*释放结点内存*/
  94.   return head;
  95. }
  96. /***********************单链表输出***************************/
  97. void PrintNode(LinkNode *ptr) /*链表输出*/
  98. {
  99.   while(ptr!=NULL) /*链表遍历循环*/
  100.   {
  101.     printf("%d\t",ptr->data ); /*输出结点数据*/
  102.     ptr=ptr->next; /*指向下一结点*/
  103.   }
  104.   printf("\n");
  105. }
  106. /*************************单链表内存释放*************************/
  107. void FreeLinkNode(LinkNode *head) /*链表的内存释放*/
  108. {
  109.   LinkNode *ptr;
  110.   while(head!=NULL)
  111.   {
  112.     ptr=head;
  113.     head=head->next ;
  114.     free(ptr);
  115.   }
  116. }
  117. /*************************主函数*************************/
  118. int main()
  119. {
  120.   int num,value;
  121.   LinkNode *head,*ptr; /*指向链表开始*/
  122.   head = CreatLinkNode(); /*创建链表*/
  123.   PrintNode(head); /*输出链表*/
  124.   printf("请输入要查找的数据:\n");
  125.   scanf("%d",&num);
  126.   ptr=FindNode(head,num); /*查询数据*/
  127.   if(!ptr)
  128.     printf("没有找到\n"); /*没有查询到*/
  129.   else
  130.   {
  131.     printf("找到啦!\n请输入要插入的数据:\n");
  132.     scanf("%d",&value);
  133.     head=InsertNode(head,ptr,value); /*插入数据*/
  134.     PrintNode(head); /*输出链表*/
  135.   }
  136.   printf("请输入要查找并删除的数据:\n");
  137.   scanf("%d",&num);
  138.   ptr=FindNode(head,num);
  139.   if(!ptr)
  140.     printf("没有找到\n");
  141.   else
  142.   {
  143.     printf("找到啦!\n");
  144.     head=DeleteNode(head,ptr);
  145.     PrintNode(head);
  146.   }
  147.   FreeLinkNode(head); /*释放链表*/
  148.   return 0;
  149. }
复制代码


凌风清羽  中级技匠
 楼主|

发表于 2016-5-22 16:55:14

数据结构学起来
回复

使用道具 举报

hnyzcj  版主

发表于 2016-5-22 17:04:33

好久远的事情,大学的内容哦
回复

使用道具 举报

凌风清羽  中级技匠
 楼主|

发表于 2016-5-22 17:06:48

hnyzcj 发表于 2016-5-22 17:04
好久远的事情,大学的内容哦

哈哈,我还年轻~~
回复

使用道具 举报

凌风清羽  中级技匠
 楼主|

发表于 2016-5-22 17:06:58


回复

使用道具 举报

dsweiliang  初级技神

发表于 2016-6-3 09:34:39

学习学习
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2024 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail