鱼C论坛

 找回密码
 立即注册
查看: 3625|回复: 4

[已解决]新手关于静态链表定义的一些问题

[复制链接]
发表于 2021-2-20 11:29:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1.静态链表是怎么定义的,我看了书上的代码 很迷茫,书上定义静态链表的节点的时候,也是用结构体来定义的,一个结构体里面存放节点的值和游标
2.但是如果是类似单链表的形式,用结构体来定义每一个节点,那么访问每一个节点的时候,必然是用结构体指针来访问,而书上的访问形式是数组以及结构体指针混用来访问,例如定义了结构体people,结构体里面游标是cur,访问元素的时候就是people.cur
3.还是说静态链表的定义其实是两个一维数组,一个数组存对应的元素,一个数组存对应的游标
  1. //用C++新建一个类,实现静态表的初始化, 获取元素的值,插入,删除操作
  2. //要求:
  3. //1.数据类型可以存储字符串
  4. //2.插入数据,是插入数据后,链表的数据顺序如下:
  5. //"ZHAO"
  6. //"QIAN"
  7. //"SUN"
  8. //"LI"
  9. //"ZHOU"
  10. //"WU"
  11. //"ZHENG"
  12. //"WANG"

  13. #include<winuser.inl>
  14. #include<stdio.h>
  15. #include <cstdlib>
  16. #include<string.h>

  17. #define MAXSIZE 100;

  18. struct People
  19. {
  20.         char name[20];
  21.         int cur;
  22.         struct People* next;
  23. };

  24. void InitialList(struct People *head)
  25. {
  26.         struct People* people;
  27.         people = head;
  28.         int i;
  29.         for(i = 0; i < MAXSIZE - 1 ; i++)
  30.         {
  31.                 people[i].cur = i + 1;
  32.         }
  33.         people[MAXSIZE - 1].cur = 0;
  34. }

  35. void getInput(struct People* people)
  36. {
  37.         printf("enter name:");
  38.         scanf_s("%s", people->name, 20);
  39. }

  40. void printfInfo(struct People* head)
  41. {
  42.         struct People* people;
  43.         people = head;
  44.         printf("name: %s \n", people->name);
  45. }

  46. void tail_add(struct People** head)
  47. {
  48.         struct People* people, * temp;
  49.         people = (struct People*)(malloc(sizeof(struct People)));  //动态申请结构体

  50.         if (people == NULL)
  51.         {
  52.                 printf("memory failed");
  53.                 exit(1);
  54.         }

  55.         getInput(people, 0);

  56.         //找尾节点
  57.         if (*head == NULL)
  58.         {
  59.                 *head = people;
  60.                 people->next = NULL;
  61.         }
  62.         else
  63.         {
  64.                 temp = *head;
  65.                 while (temp->next != NULL)
  66.                 {
  67.                         temp = temp->next;
  68.                 }
  69.                 temp->next = people;
  70.                 people->next = NULL;
  71.         }

  72. }

  73. void find(struct People** head, char find_name[])
  74. {
  75.         struct People* people;
  76.         people = *head;
  77.         //判断书否为空链表,为空,直接结束
  78.         if (people == NULL)
  79.         {
  80.                 printf("no contact people!!!!\n");
  81.         }
  82.         else
  83.         {
  84.                 while (people != NULL)
  85.                 {
  86.                         if (!strcmp(people->name, find_name))
  87.                         {
  88.                                 printfInfo(people);
  89.                                 break;
  90.                         }
  91.                         else
  92.                         {
  93.                                 people = people->next;
  94.                         }
  95.                 }
  96.         }
  97.         //while循环查找是否有符合条件的人或者到达链表的末端,跳出循环,
  98.         //找到相应的人,打印信息
  99. }

  100. void releaseMemory(struct People** head)
  101. {
  102.         struct People* people, * temp;
  103.         people = *head;
  104.         while (people->next != NULL)
  105.         {
  106.                 temp = people;
  107.                 people = people->next;
  108.                 free(temp);
  109.         }
  110. }

  111. void chang_info(struct People** head, char find_name[])
  112. {
  113.         struct People* people;
  114.         people = *head;

  115.         //遍历链表,找到姓名相同的联系人,修改其信息
  116.         if (people == NULL)
  117.         {
  118.                 printf("no contact people!!!!\n");
  119.         }
  120.         else
  121.         {
  122.                 while (people != NULL)
  123.                 {
  124.                         if (!strcmp(people->name, find_name))
  125.                         {
  126.                                 getInput(people, 1);
  127.                                 break;
  128.                         }
  129.                         else
  130.                         {
  131.                                 people = people->next;
  132.                         }
  133.                 }
  134.         }
  135. }

  136. void delete_info(struct People** head, char delete_name[])
  137. {
  138.         struct People* previous, * current;
  139.         //直接给previous赋值null,current赋值头节点,后面就不需要再用中间变量来存储之后,再进行交换地址了
  140.         //current此时就是一个空的结构体,头指针给他之后,他指向了链表的头节点
  141.         current = *head;
  142.         previous = NULL;

  143.         //找到删除值的位置的前后节点的位置
  144.         while (current != NULL && !strcmp(current->name, delete_name))
  145.         {
  146.                 previous = current;
  147.                 current = current->next;
  148.         }

  149.         //改变链表节点的指向,删除节点
  150.         if (previous == NULL)  //空链表,直接将头指针指向他
  151.         {
  152.                 printf("not found anything\n");
  153.         }
  154.         else
  155.         {
  156.                 if (previous == NULL)  //链表只有一个节点
  157.                 {
  158.                         *head = current->next;
  159.                 }
  160.                 else
  161.                 {
  162.                         previous->next = current->next;//前面用的是current 来判断有没有找到要删除的节点的位置,所以删除就是currennt的节点指向下一个
  163.                 }
  164.                 free(current);
  165.         }

  166. }

  167. void show_all(struct People** head)
  168. {
  169.         struct People* people;
  170.         people = *head;
  171.         printf("all people in the phonebook is:\n");
  172.         while (people != NULL)
  173.         {
  174.                 printfInfo(people);
  175.                 people = people->next;
  176.         }
  177.         printf("\n");

  178. }

  179. int main()
  180. {
  181.        

  182. }
复制代码
最佳答案
2021-2-20 19:04:26
猪猪虾 发表于 2021-2-20 16:49
我看书上也说是数组,但是初始化的时候就是结构体。。
按照你说的静态链表就是数组,他有游标和数据两个 ...


你不能用结构体?结构体的数组不就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-2-20 13:40:41 | 显示全部楼层
静态链表不就是一个 array 嘛。。。百度百科上写的挺明确的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-20 16:49:17 | 显示全部楼层
永恒的蓝色梦想 发表于 2021-2-20 13:40
静态链表不就是一个 array 嘛。。。百度百科上写的挺明确的

我看书上也说是数组,但是初始化的时候就是结构体。。
按照你说的静态链表就是数组,他有游标和数据两个部分,用一个数组存这两个东西,两个一维数组吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-2-20 19:04:26 | 显示全部楼层    本楼为最佳答案   
猪猪虾 发表于 2021-2-20 16:49
我看书上也说是数组,但是初始化的时候就是结构体。。
按照你说的静态链表就是数组,他有游标和数据两个 ...


你不能用结构体?结构体的数组不就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-2-21 17:26:51 | 显示全部楼层
永恒的蓝色梦想 发表于 2021-2-20 19:04
你不能用结构体?结构体的数组不就行了

傻了,明白了,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-1 02:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表