a327904410 发表于 2021-11-15 19:12:10

链表输出的问题

本帖最后由 a327904410 于 2021-11-15 20:10 编辑



#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;
typedef struct node {
        ElemType data;
        struct node* next;
}Node;

int InitNode(Node* L) {
        L = (Node*)malloc(sizeof(Node));
        L->next = L;
        return 1;
}

// 尾插
int InsNode(Node* L, ElemType x, int i) {
        int j = 1;
        Node* pre = L, * p = pre->next, * s;
        if (i <= 0)
                return 0;
        while (p != L && j < i) {
                j++;
                pre = p; p = p->next;
        }
        if (p == L && i > j + 1)
                return 0;
        else {
                s = (Node*)malloc(sizeof(Node));
                s->data = x;
                s->next = pre->next;
                pre->next = s;
                return 1;
        }
}

//输出线性表运算算法
void DispList(Node* L) {            
        Node* p = L->next;
        while (p != L) {
                printf("%d ", p->data);
                p = p->next;
        }
        printf("\n");
}

int main() {
        int i;
        Node L;
        InitNode(&L);
        InsNode(&L, 1, 1);
        InsNode(&L, 3, 2);
        InsNode(&L, 1, 3);
        InsNode(&L, 5, 4);
        InsNode(&L, 4, 5);
        InsNode(&L, 2, 6);

        DispList(&L);
        return 0;
}

a327904410 发表于 2021-11-15 19:24:17

大意了,最后输出肯定错的,可能打得急了没检查到。但我目前想知道上面显示的错误{:10_245:}

jhq999 发表于 2021-11-15 19:26:48

int main() {
      int i;
        Node L={0},*pL=&L;
      InitNode(&L);
      InsNode(&L, 1, 1);
      InsNode(&L, 3, 2);
      InsNode(&L, 1, 3);
      InsNode(&L, 5, 4);
      InsNode(&L, 4, 5);
      InsNode(&L, 2, 6);
               
      while (pL->next != NULL) {
                pL = pL->next;
                printf("%d ", pL->data);
      }
      return 0;
}

a327904410 发表于 2021-11-15 19:38:25

jhq999 发表于 2021-11-15 19:26


想问下上面的报错是什么意思,感觉每次输出都会有这类报错。上面代码是临时敲出来的,之前敲过一些单链表输出也会有这种情况出现

a327904410 发表于 2021-11-15 20:11:05

jhq999 发表于 2021-11-15 19:26


我修改了下内容,问下这个错误怎么解决。。。是不是内存分配出现问题?

jhq999 发表于 2021-11-15 20:54:42

本帖最后由 jhq999 于 2021-11-15 20:59 编辑

a327904410 发表于 2021-11-15 20:11
我修改了下内容,问下这个错误怎么解决。。。是不是内存分配出现问题?

L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习惯,要不bug早晚找上门,
如果你记性好当我没说

a327904410 发表于 2021-11-16 00:01:16

jhq999 发表于 2021-11-15 20:54
L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习 ...

刚刚调试了一下,发现在尾插的时候表尾好像没指向表头,在输出的时候表尾的下一位也是没指向表头。不知道是不是这个原因导致的程序错误,虽然能输出结果。大佬方便帮我改下代码吗,看了其他人写的单链表还是不懂怎么修改。{:10_266:}

jhq999 发表于 2021-11-16 06:46:12

本帖最后由 jhq999 于 2021-11-16 06:51 编辑

a327904410 发表于 2021-11-16 00:01
刚刚调试了一下,发现在尾插的时候表尾好像没指向表头,在输出的时候表尾的下一位也是没指向表头。不知道 ...

单链表结尾next一般都是空指针(也就是结束标志),这样用于循环查找时判断已经撸了一遍。如果表尾接表头是个圈而不是链没有结尾,你在查找时就是死循环。
看3楼已经给你答案了

a327904410 发表于 2021-11-16 12:56:08

jhq999 发表于 2021-11-16 06:46
单链表结尾next一般都是空指针(也就是结束标志),这样用于循环查找时判断已经撸了一遍。如果表尾接表头 ...

这个我懂,只不过我写的是循环单链表,正常来说表尾指向表头就代表结束的{:10_266:}

jhq999 发表于 2021-11-16 15:01:25

本帖最后由 jhq999 于 2021-11-16 15:10 编辑

a327904410 发表于 2021-11-16 12:56
这个我懂,只不过我写的是循环单链表,正常来说表尾指向表头就代表结束的

明白了
int InitNode(Node* L) {
      //L = (Node*)malloc(sizeof(Node));//画蛇添足,L已经有实例了不需要申请内存,
      //申请了新内存空间只不过是让形参的指针指向新内存,形参和实参再也没有关系
      L->next = L;
      return 1;
}
或者
#include<stdio.h>
#include<stdlib.h>

typedef int ElemType;
typedef struct node {
      ElemType data;
      struct node* next;
}Node;

int InitNode(Node**L) {//////////////
      *L = (Node*)malloc(sizeof(Node));
      (*L)->next = *L;
      return 1;
}

// 尾插
int InsNode(Node* L, ElemType x, int i) {
      int j = 1;
      Node* pre = L, * p = pre->next, * s;
      if (i <= 0)
                return 0;
      while (p != L && j < i) {
                j++;
                pre = p; p = p->next;
      }
      if (p == L && i > j + 1)
                return 0;
      else {
                s = (Node*)malloc(sizeof(Node));
                s->data = x;
                s->next = pre->next;
                pre->next = s;
                return 1;
      }
}

//输出线性表运算算法
void DispList(Node* L) {            
      Node* p = L->next;
      while (p != L) {
                printf("%d ", p->data);
                p = p->next;
      }
      printf("\n");
}

int main() {
      int i;
      Node *L=NULL;/////////
      InitNode(&L);//////////
      InsNode(L, 1, 1);
      InsNode(L, 3, 2);
      InsNode(L, 1, 3);
      InsNode(L, 5, 4);
      InsNode(L, 4, 5);
      InsNode(L, 2, 6);

      DispList(L);
      return 0;
}

a327904410 发表于 2021-11-16 19:11:17

jhq999 发表于 2021-11-16 15:01
明白了

或者

看来我对指针了解还是不够,得去补补课了。谢谢大佬的改正{:10_266:}

a327904410 发表于 2021-11-19 00:35:54

jhq999 发表于 2021-11-15 20:54
L->next没初始化,里面是随意的指针地址,最后表尾p = p->next;后p就是随意指针
养成指针初始化的好习 ...

这句话现在懂了,看了几天关于动态内存申请视频。因为我是敲C/C++书本的代码,之前不懂指针要初始化,以为都是创建好然后再赋值
页: [1]
查看完整版本: 链表输出的问题