接上篇数组,本篇主要学习链表,实现了创建、遍历、查找给定位置的值以及插入。其他的操作就不写了,基本类似(以非循环单链表为例子),见代码,有详细注释

  1. #include <stdio.h> 
  2. #include <malloc.h> 
  3. #include <stdlib.h> 
  4. /* 
  5. * 定义一个节点的数据类型 
  6. * 
  7. */ 
  8. typedef struct Node 
  9.     int data;//数据域 
  10.     struct Node * pNext;//指针域 
  11. }NODE,*PNODE; 
  12.  
  13.  
  14. /** 
  15. * 创建链表 
  16. * @return PNODE  
  17. * 
  18. */ 
  19. PNODE create(){ 
  20.     int length;//节点个数 
  21.     printf("请输入生成的链表的节点个数 length = "); 
  22.     scanf("%d",&length); 
  23.     //申请链表头节点地址 
  24.     PNODE pHead = (PNODE)malloc(sizeof(NODE)); 
  25.     if(NULL == pHead){ 
  26.         printf("头节点生成失败");   
  27.         exit(-1); 
  28.     } 
  29.     //定义尾节点 
  30.     PNODE pTail = pHead;//尾节点总是等于当前链表的最后节点 
  31.     pTail->pNext = NULL; 
  32.     //接收输入值作为生成节点的值 
  33.     int data; 
  34.     for(int i=1;i<=length;i++){ 
  35.         //循环生成length个节点 
  36.         PNODE pNode = (PNODE)malloc(sizeof(NODE)); 
  37.         if(NULL == pNode){ 
  38.             printf("第%d个节点生成失败",i); 
  39.             exit(-1); 
  40.         } 
  41.         printf("请输入第%d个节点的值:",i); 
  42.         scanf("%d",&data); 
  43.         pNode->data = data; 
  44.         pNode->pNext = NULL; 
  45.         pTail->pNext = pNode;//因为新生成了一个节点,所以生成前的尾节点指向新生成的节点 
  46.         pTail = pNode;//当前生成的节点成了新的尾节点 
  47.     } 
  48.     return pHead; 
  49.  
  50.  
  51. /** 
  52. * 遍历一个链表 
  53. * @param PNODE pHead 
  54. */ 
  55. void traverse(PNODE pHead){ 
  56.     if(NULL == pHead->pNext){ 
  57.         printf("没有节点"); 
  58.         exit(-1); 
  59.     } 
  60.     PNODE cNode = pHead->pNext;//初始化当首节点为头节点 
  61.     int i = 1;//记录节点位置 
  62.     while(NULL != cNode){//如果当前节点不为空 
  63.         printf("第%d个节点的值是:%d\n",i,cNode->data); 
  64.         cNode = cNode->pNext;//当前节点后移位 
  65.         i ++; 
  66.     } 
  67.     return
  68.  
  69. /** 
  70. * 查找链表给定位置的值 
  71. * @param PNODE pHead 
  72. * @param int pos 
  73. * @return int 
  74. */ 
  75. int get(PNODE pHead,int pos){ 
  76.     if(NULL == pHead->pNext){ 
  77.         printf("没有节点"); 
  78.         exit(-1); 
  79.     } 
  80.     PNODE cNode = pHead->pNext;//初始化当前节点为首节点 
  81.     int i = 1;//计数器 
  82.     while(NULL != cNode && i < pos){//查到第pos个节点 
  83.         cNode = cNode->pNext; 
  84.         i++; 
  85.     } 
  86.     if(NULL == cNode || i > pos){ 
  87.         printf("不存在第%d个节点",pos); 
  88.         exit(-1); 
  89.     } 
  90.     return cNode->data; 
  91.  
  92. /** 
  93. * 指定位置后面插入节点 
  94. * @param PNODE pHead 
  95. * @param int pos 
  96. * @param PNODE pNode 
  97. */ 
  98. void insert(PNODE pHead,int pos,PNODE pNode){ 
  99.     PNODE cNode = pHead->pNext;//初始化当前节点为首节点 
  100.     int i = 1;//计数器 
  101.     while(NULL != cNode && i < pos){//查到第pos个节点 
  102.         cNode = cNode->pNext; 
  103.         i++; 
  104.     } 
  105.     if(NULL == cNode || i > pos){ 
  106.         printf("不存在第%d个节点\n",pos); 
  107.         exit(-1); 
  108.     } 
  109.     if(NULL == cNode->pNext){//第pos个节点正好似尾节点,直接追加 
  110.         cNode->pNext = pNode; 
  111.         return
  112.     } 
  113.     pNode->pNext = cNode->pNext;//将待插入的节点的指针指向当前节点的下一个节点 
  114.     cNode->pNext = pNode; 
  115.     return
  116.  
  117. void main(){ 
  118.     PNODE  pHead = NULL;//头结点 
  119.     pHead = create();//创建链表 
  120.     traverse(pHead);//遍历链表 
  121.     int data = get(pHead,2);//查找第2个节点的值 
  122.     printf("查到的值为%d\n",data); 
  123.     //构造一个新的节点 
  124.     NODE node; 
  125.     node.data = 100; 
  126.     node.pNext = NULL; 
  127.     insert(pHead,2,&node); 
  128.     traverse(pHead);