C 需要帮助找出链接列表程序给出垃圾值或内存访问错误的原因吗

C 需要帮助找出链接列表程序给出垃圾值或内存访问错误的原因吗,c,debugging,linked-list,C,Debugging,Linked List,我是第一次贴海报,所以我不太清楚标准,如果我的格式不好,请原谅 我是C语言编程新手,最近接触了链表,下面的代码是我做链表的拙劣尝试。。我想知道是否有人愿意仔细阅读我的代码,并解释我为什么面临这些问题。提前谢谢!我会尽力回答任何问题 为了解释我的一些职能 createlinklist:只需初始化结构linklist并添加一个int值 addlinkfirst:在末尾添加一个节点 removelinklast:从末端移除节点 dispalylinklist:打印链接列表的内容 代码: #包括 结构链

我是第一次贴海报,所以我不太清楚标准,如果我的格式不好,请原谅

我是C语言编程新手,最近接触了链表,下面的代码是我做链表的拙劣尝试。。我想知道是否有人愿意仔细阅读我的代码,并解释我为什么面临这些问题。提前谢谢!我会尽力回答任何问题

为了解释我的一些职能

  • createlinklist:只需初始化结构linklist并添加一个int值
  • addlinkfirst:在末尾添加一个节点
  • removelinklast:从末端移除节点
  • dispalylinklist:打印链接列表的内容
  • 代码:

    #包括
    结构链接列表{
    int数据;
    结构链接列表*链接;
    };
    void createlinklist(结构链接列表*新列表,int数据){
    新建列表->数据=数据;
    newlist->link=NULL;
    }
    void addlinkfirst(结构链接列表*列表,整数数据){
    while(列表->链接!=NULL)
    列表=列表->链接;
    struct linklist*newlist=malloc(sizeof(struct linklist));
    newlist->link=NULL;
    列表->链接=&newlist;
    新建列表->数据=数据;
    }
    void removelinklast(结构链接列表*列表){
    结构链接列表*temp;
    while(list!=NULL){
    temp=&list;
    列表=列表->链接;
    }
    temp->data=NULL;
    temp->link=NULL;
    }
    无效显示链接列表(结构链接列表*列表){
    printf(“\n”);
    while(list!=NULL){
    printf(“%d-”,列表->数据);
    列表=列表->链接;
    }
    printf(“\n”);
    }
    int main(){
    int x=1,数据,x1;
    结构链接列表测试;
    而(x!=0){
    printf(“按4创建,按1插入,按2删除,按3显示,按0退出\n”);
    scanf(“%d”和&x);
    //我想你会先选择4,然后选择其他选项
    开关(x){
    案例4:printf(“\n输入第一个元素的数据:”);scanf(“%d”,&data);createlinklist(&test,data);break;
    案例1:printf(“\n输入数据:”);scanf(“%d”,&x1);addlinkfirst(&test,x1);break;
    案例2:printf(“\n删除”);removelinklast(&test);break;
    案例3:显示链接列表(&T);中断;
    案例0:断裂;
    默认值:printf(“无效输入重试\n”);
    }
    }
    printf(“\n感谢您使用我的链接列表程序;”);
    返回0;
    }
    
    在主线中,这一行:

    struct linklist test;
    
    在堆栈上创建节点,但不初始化它。它有未定义的数据,最重要的是,链接成员不为NULL。那是个不好的起点

    您可能希望从如下指针开始:

    struct linklist *test = NULL;
    
    这将表示空列表。要向其中添加元素,请像这样调用addlink:
    addlink(&test,42),具有以下实现:

    void addlink(struct linklist **p_list, int data) {
        if (*p_list == NULL) {
            *p_list = makelist(data);
        }
        else {
            addlink(&(*p_list)->link, data);
        }
    }
    
    struct linklist *makelist(int data) {
        struct linklist *list = malloc(sizeof(struct linklist));
        list->link = NULL;
        list->data = data;
        return list;
    }
    

    在这里,
    addlink
    是递归的,但是您也可以在不使用递归的情况下轻松地编写它。在
    makelist
    中,创建了一个包含单个元素的列表。我将把
    removelist
    函数留给您作为练习,但它还应该包含一个带有双指针的
    struct linklist**
    参数,您可以这样调用它:
    removelist(&test)

    这是否回答了您的问题?
    void addlink(struct linklist **p_list, int data) {
        if (*p_list == NULL) {
            *p_list = makelist(data);
        }
        else {
            addlink(&(*p_list)->link, data);
        }
    }
    
    struct linklist *makelist(int data) {
        struct linklist *list = malloc(sizeof(struct linklist));
        list->link = NULL;
        list->data = data;
        return list;
    }