黑马程序员技术交流社区

标题: 关于链表的一段小程序 求解释啊 看不懂 [打印本页]

作者: 格子、    时间: 2014-6-3 13:23
标题: 关于链表的一段小程序 求解释啊 看不懂
这事一份操作单链表的小程序,看着很糊涂,求明白的打什么讲解一下啊,想注释一下都不知道怎么注释!!!
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int datatype;

  4. typedef struct node
  5. {
  6.     datatype data;
  7.     struct node *next;
  8. }listnode, *linklist;

  9. linklist linklist_create(int n)
  10. {
  11.     int i;
  12.     linklist H, p, q;
  13.     H = (linklist)malloc(sizeof(listnode));
  14.     if (H == NULL)
  15.     {
  16.         printf("malloc error\n");
  17.         return H;
  18.     }
  19.     H->data = 1;
  20.     H->next = H;
  21.     p = H;

  22.     i = 2;
  23.     while (i <= n)
  24.     {
  25.         q = (linklist)malloc(sizeof(listnode));
  26.         if (q == NULL)
  27.         {
  28.             printf("malloc error\n");
  29.             return q;
  30.         }
  31.         q->data = i;
  32.         p->next = q;
  33.         q->next = H;
  34.         p = q;
  35.         i++;
  36.     }

  37.     return H;
  38. }

  39. void linklist_show(linklist H)
  40. {
  41.     linklist p = H;

  42.     while (p->next != H)
  43.     {
  44.         printf("%d ", p->data);
  45.         p = p->next;
  46.     }

  47.     printf("%d\n", p->data);
  48. }

  49. int jose(linklist H, int k, int m)
  50. {
  51.     int i = 0;
  52.     linklist p = H, q;
  53.     while (i < k-1)
  54.     {
  55.         p = p->next;
  56.         i++;
  57.     }
  58.     printf("%d\n", p->data);
  59.     while (p->next != p)
  60.     {
  61.         i = 0;
  62.         while (i < m-2)
  63.         {
  64.             p = p->next;
  65.             i++;
  66.         }

  67.         q = p->next;
  68.         p->next = q->next;
  69.         printf("%d ", q->data);
  70.         free(q);
  71.         q = NULL;
  72.         p = p->next;
  73.     }
  74.     printf("%d\n", p->data);
  75. }

  76. int main()
  77. {
  78.     linklist H;
  79.     H = linklist_create(8);

  80.     linklist_show(H);
  81.     jose(H, 3, 4);

  82.     return 0;
  83. }
复制代码


作者: huangqiwa    时间: 2014-6-4 12:32
  1. #include <stdio.h>
  2. #include <stdlib.h>

  3. typedef int datatype;

  4. typedef struct node
  5. {
  6.     datatype data;
  7.     struct node *next;
  8. }listnode, *linklist;
  9. //定义一个节点,实际上就是一个结构体
  10. //里面包含了一个int 类型的data和一个指向该结构体类型的指针
  11. linklist linklist_create(int n)//这个函数的功能是创建一个链表,参数int 是需要创建节点的个数
  12. {
  13.     int i;
  14.     linklist H, p, q; 定义了三个节点指针
  15.     H = (linklist)malloc(sizeof(listnode));//分配节点内存并且把地址赋给H指针,也就是头节点
  16.     if (H == NULL)
  17.     {
  18.         printf("malloc error\n");
  19.         return H;
  20.     }
  21.     H->data = 1;//结构体赋值
  22.     H->next = H;//将下一个指针指向自己
  23.     p = H;//当前指针也指向自己

  24.     i = 2;
  25.     while (i <= n)//这个循环就重复创建节点,并且把节点插入到当前链表中
  26.     {
  27.         q = (linklist)malloc(sizeof(listnode));
  28.         if (q == NULL)
  29.         {
  30.             printf("malloc error\n");
  31.             return q;
  32.         }
  33.         q->data = i;
  34.         p->next = q;
  35.         q->next = H;
  36.         p = q;
  37.         i++;
  38.     }

  39.     return H;
  40. }

  41. void linklist_show(linklist H)//遍历整个链表,并且打印出来data的值
  42. {
  43.     linklist p = H;

  44.     while (p->next != H)
  45.     {
  46.         printf("%d ", p->data);
  47.         p = p->next;
  48.     }

  49.     printf("%d\n", p->data);
  50. }

  51. int jose(linklist H, int k, int m)//这个不知道是在做什么,大神指点!
  52. {
  53.     int i = 0;
  54.     linklist p = H, q;
  55.     while (i < k-1)
  56.     {
  57.         p = p->next;
  58.         i++;
  59.     }
  60.     printf("%d\n", p->data);
  61.     while (p->next != p)
  62.     {
  63.         i = 0;
  64.         while (i < m-2)
  65.         {
  66.             p = p->next;
  67.             i++;
  68.         }

  69.         q = p->next;
  70.         p->next = q->next;
  71.         printf("%d ", q->data);
  72.         free(q);
  73.         q = NULL;
  74.         p = p->next;
  75.     }
  76.     printf("%d\n", p->data);
  77. }
  78. PS:另外jose这个函数最后少了一个return 0;
  79. int main()
  80. {
  81.     linklist H;
  82.     H = linklist_create(8);

  83.     linklist_show(H);
  84.     jose(H, 3, 4);

  85.     return 0;
  86. }
复制代码





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2