鱼C论坛

 找回密码
 立即注册
查看: 1397|回复: 8

[已解决]关于链表的问题

[复制链接]
发表于 2023-10-12 16:14:06 | 显示全部楼层 |阅读模式

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

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

x
有没有大佬帮忙看看为什么无论插入的是多少,链表中总是会多出来一个8

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MaxSize 50
  4. typedef int ElemType; // 把int替换成了Elemtype
  5. typedef struct LinkList
  6. {
  7.     ElemType elem;                                        // 存储整形元素
  8.     struct LinkList *next;                                // 指向直接后继元素的指针
  9. } LinkList;                                               // 等同于用typedef把struct LinkList定义成Linklist就不需要再输入struct LinkList,可以直接输入LinkList
  10. void InitList(LinkList *L);                               // 初始化链表声明
  11. void CreateList(LinkList *L, ElemType a[], ElemType n);   // 创建链表声明
  12. ElemType ListInsert(LinkList *L, ElemType i, ElemType e); // 链表插入声明
  13. ElemType ListDelete(LinkList *L, ElemType i);             // 删除链表声明
  14. void printlist(LinkList *headpoint);                      // 打印输出表中元素
  15. ElemType main(void)
  16. {
  17.     LinkList head;                                                                                                     // 头结点
  18.     LinkList *headpoint = &head;                                                                                       // 指向头结点的指针(结构体变量并不指向结构体,所以需要声明结构体指针)
  19.     ElemType elements[MaxSize], n = 0, insertposition1, insertvalue1, insertposition2, insertvalue2, delete1, delete2; //
  20.     InitList(headpoint);
  21.     printf("##创建链表##\n\n");
  22.     printf("请输入链表中元素值,以空格分隔(如,从键盘上依次输入21 18 30 75 42 56):");
  23.     for (int i = 0; i < MaxSize; i++)
  24.     {
  25.         scanf("%d", &elements[i]);
  26.         n++;
  27.         if (getchar() == '\n')
  28.         {
  29.             break;
  30.         }
  31.     }
  32.     /*   putchar('\n');
  33.     for (int i = 0; i < MaxSize; i++)
  34.      {
  35.          printf("%d ", elements[i]);
  36.      }
  37.      putchar('\n');*/
  38.     CreateList(headpoint, elements, n);
  39.     printlist(headpoint); // 输出各元素的值
  40.     putchar('\n');
  41.     printf(
  42.         "\n##插入操作##\n\n"
  43.         "请输入第一次要插入的位置和插入的数值(插入位置和插入数值之间以空格相隔,如2 5,表示第2个位置插入数值5):");
  44.     scanf("%d %d", &insertposition1, &insertvalue1);
  45.     if (ListInsert(headpoint, insertposition1, insertvalue1))
  46.     {
  47.         printf("在第%d个位置插入%d成功\n", insertposition1, insertvalue1);
  48.     }
  49.     else
  50.     {
  51.         printf("在第%d个位置插入%d失败,插入位置不合法\n", insertposition1, insertvalue1);
  52.     }
  53.     printlist(headpoint);
  54.     putchar('\n');
  55.     printf(
  56.         "请输入第二次要插入的位置和插入的数值(插入位置和插入数值之间以空格相隔,如2 5,表示第2个位置插入数值5):");
  57.     scanf("%d %d", &insertposition2, &insertvalue2);
  58.     if (ListInsert(headpoint, insertposition2, insertvalue2))
  59.     {
  60.         printf("在第%d个位置插入%d成功\n", insertposition2, insertvalue2);
  61.     }
  62.     else
  63.     {
  64.         printf("在第%d个位置插入%d失败,插入位置不合法\n", insertposition2, insertvalue2);
  65.     }
  66.     printlist(headpoint);
  67.     putchar('\n');
  68.     printf(
  69.         "\n##删除操作##\n\n"
  70.         "请输入第一次要删除元素的位置(如 2 表示删除第2个位置的数值):");
  71.     scanf("%d", &delete1);
  72.     if (ListDelete(headpoint, delete1))
  73.     {
  74.         printf("删除第%d个数据元素成功\n", delete1);
  75.     }
  76.     else
  77.     {
  78.         printf("删除第%d个数据元素失败,删除位置不合法\n", delete1);
  79.     }
  80.     printlist(headpoint);
  81.     putchar('\n');
  82.     printf(
  83.         "请输入第二次要删除元素的位置(如 2 表示删除第2个位置的数值):");
  84.     scanf("%d", &delete2);
  85.     if (ListDelete(headpoint, delete2))
  86.     {
  87.         printf("删除第%d个数据元素成功\n", delete2);
  88.     }
  89.     else
  90.     {
  91.         printf("删除第%d个数据元素失败,删除位置不合法\n", delete2);
  92.     }
  93.     printlist(headpoint);
  94.     putchar('\n');
  95.     printf("\n=====顺序表初始化、插入,删除等操作已完成,程序结束!=====\n\n");
  96.     system("pause");
  97.     return 0;
  98. }
  99. void InitList(LinkList *L) /* 初始化链表 */
  100. {
  101.     L = (struct LinkList *)malloc(sizeof(struct LinkList *));
  102.     L->next = NULL;
  103. }
  104. void CreateList(LinkList *L, ElemType a[], int n) /*创建链表 */
  105. {
  106.     LinkList *pre = L;
  107.     int i;
  108.     for (i = n - 1; i >= 0; i--)
  109.     {
  110.         LinkList *t = (struct LinkList *)malloc(sizeof(struct LinkList *));
  111.         t->elem = a[i];
  112.         t->next = NULL;
  113.         pre->next = t;
  114.         pre = pre->next;
  115.     }
  116. }
  117. int ListInsert(LinkList *L, int i, ElemType e) /*按i位置插入元素*/
  118. {

  119.     int j = 0;
  120.     LinkList *p = L;
  121.     while (p && (j < i - 1))
  122.     {
  123.         p = p->next;
  124.         j++;
  125.     }
  126.     if (!p || (j > i - 1))
  127.         return 0;
  128.     LinkList *t = (struct LinkList *)malloc(sizeof(struct LinkList *));
  129.     t->elem = e;
  130.     t->next = p->next;
  131.     p->next = t;
  132.     return 1;
  133. }
  134. int ListDelete(LinkList *L, int i) /*删除某个位置的元素*/
  135. {
  136.     int j = 0;
  137.     LinkList *p = L;
  138.     LinkList *del = NULL;
  139.     while ((p->next) && (j < i - 1))
  140.     {
  141.         p = p->next;
  142.         j++;
  143.     }
  144.     if (!(p->next) || (j > i - 1))
  145.         return 0;
  146.     del = p->next;
  147.     p->next = del->next;

  148.     free(del);
  149.     return 1;
  150. }
  151. void printlist(LinkList *headpoint) // 打印输出表中元素
  152. {
  153.     printf("当前表中元素如下\n");
  154.     LinkList *p = headpoint;
  155.     while (p != NULL)
  156.     {
  157.         printf("%d ", p->elem);
  158.         p = p->next;
  159.     }
  160. }
复制代码
最佳答案
2023-10-12 16:15:01
请问在您这里的链表中,哪一个地方会多出来一个8呢?是在链表长度的输出中还是在其他地方呢?

球一个最佳答案谢谢啦!这对我非常重要!
1697098352746.png
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2023-10-12 16:14:22 | 显示全部楼层
在函数InitList中,L = (struct LinkList *)malloc(sizeof(struct LinkList *)),这里应该是malloc(sizeof(struct LinkList)),因为sizeof(struct LinkList *)只是指针的大小,而不是整个结构体的大小。这个错误导致了头结点没有被正确初始化,所以在打印链表时会多出一个8。

正确的InitList函数应该是这样的:

void InitList(LinkList *L) /* 初始化链表 */
{
    L->next = NULL;
}
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-12 16:15:01 | 显示全部楼层    本楼为最佳答案   
请问在您这里的链表中,哪一个地方会多出来一个8呢?是在链表长度的输出中还是在其他地方呢?

球一个最佳答案谢谢啦!这对我非常重要!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-12 16:15:36 | 显示全部楼层
isdkz 发表于 2023-10-12 16:14
在函数InitList中,L = (struct LinkList *)malloc(sizeof(struct LinkList *)),这里应该是malloc(sizeof( ...

怎么做到秒回的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-12 16:15:39 | 显示全部楼层
你的代码中存在一些问题,导致链表中总是会多出来一个8。问题主要出在你的初始化和创建链表的函数中。

在你的 InitList 函数中,你为 L 分配了内存,但是这个 L 是一个局部变量,它的改变并不会影响到函数外部的变量。所以,你在 main 函数中的 head 结构体并没有被正确初始化。

在你的 CreateList 函数中,你为新的节点分配内存时,使用了 sizeof(struct LinkList *),这实际上是分配了一个指针的大小,而不是一个 LinkList 结构体的大小。这可能会导致内存溢出,从而产生未定义的行为。

以下是修正后的代码:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MaxSize 50
  4. typedef int ElemType;

  5. typedef struct LinkList {
  6.     ElemType elem;
  7.     struct LinkList *next;
  8. } LinkList;

  9. void InitList(LinkList **L);
  10. void CreateList(LinkList *L, ElemType a[], int n);
  11. int ListInsert(LinkList *L, int i, ElemType e);
  12. int ListDelete(LinkList *L, int i);
  13. void printlist(LinkList *headpoint);

  14. int main(void) {
  15.     // ...
  16.     LinkList *headpoint;
  17.     InitList(&headpoint);
  18.     // ...
  19. }

  20. void InitList(LinkList **L) {
  21.     *L = (LinkList *)malloc(sizeof(LinkList));
  22.     (*L)->next = NULL;
  23. }

  24. void CreateList(LinkList *L, ElemType a[], int n) {
  25.     LinkList *pre = L;
  26.     for (int i = n - 1; i >= 0; i--) {
  27.         LinkList *t = (LinkList *)malloc(sizeof(LinkList));
  28.         t->elem = a[ i];
  29.         t->next = NULL;
  30.         pre->next = t;
  31.         pre = pre->next;
  32.     }
  33. }

  34. // ...
复制代码


这样,你的 headpoint 就会被正确初始化,而且在创建链表时,每个节点都会被正确分配内存。
请注意,本回答来自GPT-4
如果问题已经解决,请设置最佳答案
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-12 16:18:04 | 显示全部楼层
本帖最后由 1613551 于 2023-10-12 16:19 编辑
isdkz 发表于 2023-10-12 16:14
在函数InitList中,L = (struct LinkList *)malloc(sizeof(struct LinkList *)),这里应该是malloc(sizeof( ...


我试试
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-12 16:19:39 | 显示全部楼层
isdkz 发表于 2023-10-12 16:14
在函数InitList中,L = (struct LinkList *)malloc(sizeof(struct LinkList *)),这里应该是malloc(sizeof( ...

不行,这样改的话还是会多一个8
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-10-12 16:49:42 | 显示全部楼层
不行,chatgpt就是个垃圾玩意,一点也不智能。多了一个8是因为我把头结点的值也给打印出来了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-10-12 19:03:41 | 显示全部楼层
1613551 发表于 2023-10-12 13:49
不行,chatgpt就是个垃圾玩意,一点也不智能。多了一个8是因为我把头结点的值也给打印出来了

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-9 13:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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