鱼C论坛

 找回密码
 立即注册
查看: 1153|回复: 2

[已解决]链表在数组指定位置插入元素,第一次输入没问题,第二次就开始报错。。

[复制链接]
发表于 2021-1-6 19:27:02 | 显示全部楼层 |阅读模式

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

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

x
  1. #include<winuser.inl>
  2. #include<stdio.h>
  3. #include <cstdlib>
  4. #include<string.h>
  5. //将一个整数插进一个有序的数组
  6. void getInput(struct Array* number);
  7. void printfInfo(struct Array** head);
  8. void releaseMemory(struct Array** head);
  9. void tail_add(struct Array** head);

  10. void find_position(struct Array** head, int insert_number);
  11. struct Array
  12. {
  13.         int value;
  14.         struct Array *next;
  15. };

  16. void getInput(struct Array* number)
  17. {
  18.         printf("enter number:");
  19.         scanf_s("%d", &number->value);
  20. }


  21. void printfInfo(struct Array** head)
  22. {
  23.         struct Array* number;
  24.         number = *head;
  25.         printf("the array is:\n");
  26.         while (number != NULL)
  27.         {
  28.                 printf("%d",number->value);
  29.                 number = number->next;
  30.         }
  31.         printf("\n");       
  32. }

  33. void releaseMemory(struct Array** head)
  34. {
  35.         struct Array* number, * temp;
  36.         number = *head;
  37.         while (number->next != NULL)
  38.         {
  39.                 temp = number;
  40.                 number = number->next;
  41.                 free(temp);
  42.         }
  43. }

  44. void find_position(struct Array** head,int insert_number)
  45. {
  46.         struct Array* previous,*current,*new_node;
  47.         //直接给previous赋值null,current赋值头节点,后面就不需要再用中间变量来存储之后,再进行交换地址了
  48.         //current此时就是一个空的结构体,头指针给他之后,他指向了链表的头节点
  49.         current = *head;
  50.         previous = NULL;

  51.         //找到合适于插入值的位置的前后节点的位置
  52.         while (current->next != NULL && current->value < insert_number)
  53.         {
  54.                 previous = current;
  55.                 current = current->next;
  56.         }

  57.         //生成一个新的节点
  58.         new_node = (struct Array*)(malloc(sizeof(struct Array)));
  59.         if (new_node == NULL)
  60.         {
  61.                 printf("memory failed");
  62.                 exit(1);
  63.         }

  64.         //将新的节点变成链表里面的一员,插入到前面找到的合适的位置那
  65.         if(current->next == NULL)  //空链表,直接将头指针指向他
  66.         {
  67.                 *head = new_node;
  68.         }
  69.         else
  70.         {
  71.                 previous->next = new_node;
  72.                 new_node->next = current;
  73.                 new_node->value = insert_number;
  74.         }

  75. }

  76. void tail_add(struct Array** head)
  77. {
  78.         struct Array* number, * temp;

  79.         number = (struct Array*)(malloc(sizeof(struct Array)));
  80.         if (number == NULL)
  81.         {
  82.                 printf("memory failed");
  83.                 exit(1);
  84.         }
  85.         getInput(number);

  86.         if (*head != NULL)
  87.         {
  88.                 temp = *head;
  89.                 //找尾节点
  90.                 while (temp->next != NULL)
  91.                 {
  92.                         temp = temp->next;
  93.                 };

  94.                 //插入数据
  95.                 temp->next = number;
  96.                 number->next = NULL;
  97.         }

  98.         else
  99.         {
  100.                 *head = number;
  101.                 number->next = NULL;
  102.         }
  103. }


  104. int main()
  105. {
  106.         struct Array* numberarray = NULL;  ////初始化一个指针,头指针,相当于定义了一个空的单链表
  107.         //struct Student* stu = NULL;

  108.         int num;
  109.         printf("total num of stu:");
  110.         scanf_s("%d", &num);
  111.         printf("\n");

  112.         printf("enter info:\n");
  113.         for (int i = 0; i < num; i++)
  114.         {
  115.                 tail_add(&numberarray);
  116.         }
  117.         printf("finish entering!\n");

  118.         //printf("begining to print\n");
  119.         //printfInfo(&namelist);
  120.         int insert_number;
  121.         char sign[10];
  122.         do
  123.         {
  124.                 printf("enter the number you want to insert:");
  125.                 scanf_s("%d", &insert_number);
  126.                 find_position(&numberarray, insert_number);
  127.                 printfInfo(&numberarray);

  128.                 printf("enter any letter continue,#表示结束\n");
  129.                 scanf_s("%s", sign,10);
  130.         } while (sign[0] != '#');
  131.        
  132.         releaseMemory(&numberarray);
  133.         return 0;

  134. }
复制代码
最佳答案
2021-1-6 20:11:02
  1. void find_position(struct Array** head,int insert_number)
  2. {
  3.         struct Array* previous,*current,*new_node;
  4.         previous = * head;
  5.         current = (previous == NULL) ? NULL : previous->next;
  6.         new_node = (struct Array*)(malloc(sizeof(struct Array)));

  7.         if (new_node == NULL)
  8.         {
  9.                 printf("memory failed");
  10.                 exit(1);
  11.         }
  12.         else
  13.         {
  14.                 new_node->value = insert_number;
  15.                 new_node->next = NULL;
  16.         }
  17.        
  18.         if(previous == NULL || insert_number <= previous->value)
  19.         {
  20.                 *head = new_node;
  21.                 (*head)->next = previous;
  22.         }
  23.         else
  24.         {
  25.                 while (current != NULL && current->value < insert_number)
  26.                 {
  27.                         previous = current;
  28.                         current = current->next;
  29.                 }

  30.                 previous->next = new_node;
  31.                 new_node->next = current;
  32.         }
  33. }
复制代码
捕获.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-1-6 20:06:28 | 显示全部楼层
        find_position() 有错误,下面是重写的
  1. void find_position(struct Array ** head , int insert_number)
  2. {
  3.         struct Array  * p , * q , * r                                                 ;
  4.         r = (struct Array *) malloc(sizeof(struct Array))                             ;
  5.         r -> value = insert_number                                                    ;
  6.         r -> next = NULL                                                              ;
  7.         for(p = q = * head ; p && p -> value < insert_number ; q = p , p = q -> next) ;
  8.         if(p == q) {
  9.                 r -> next = * head                                                    ;
  10.                 * head = r                                                            ;
  11.         } else {
  12.                 q -> next = r                                                         ;
  13.                 r -> next = p                                                         ;
  14.         }
  15. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-1-6 20:11:02 | 显示全部楼层    本楼为最佳答案   
  1. void find_position(struct Array** head,int insert_number)
  2. {
  3.         struct Array* previous,*current,*new_node;
  4.         previous = * head;
  5.         current = (previous == NULL) ? NULL : previous->next;
  6.         new_node = (struct Array*)(malloc(sizeof(struct Array)));

  7.         if (new_node == NULL)
  8.         {
  9.                 printf("memory failed");
  10.                 exit(1);
  11.         }
  12.         else
  13.         {
  14.                 new_node->value = insert_number;
  15.                 new_node->next = NULL;
  16.         }
  17.        
  18.         if(previous == NULL || insert_number <= previous->value)
  19.         {
  20.                 *head = new_node;
  21.                 (*head)->next = previous;
  22.         }
  23.         else
  24.         {
  25.                 while (current != NULL && current->value < insert_number)
  26.                 {
  27.                         previous = current;
  28.                         current = current->next;
  29.                 }

  30.                 previous->next = new_node;
  31.                 new_node->next = current;
  32.         }
  33. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-5-3 04:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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