0

在使用链表功能时,我遇到的每个问题。Visual Studio 刚刚突然停止工作。以下是我的代码:

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

typedef struct _listnode
{
int item;
struct _listnode* next;
}Listnode;

void printlist(Listnode *head);
void main(){
Listnode *head, *temp;
int i = 0;
head = malloc(sizeof(Listnode));
temp = head;
for(;i<3;i++){
    temp->item = i;
    if (i != 2){
        temp->next = malloc(sizeof(Listnode));
        temp = temp->next;
    }
    else
        temp = NULL;
}
printlist(head);
    }
    void printlist(Listnode *head){
if (head == NULL)
    printf("Your list is empty");
while(head != NULL){
    printf(" %d ",head->item);
    head = head->next;
}
printf(" \n ");
    }

    Output: 
    0 1 2 

然后它显示了以下消息 在此处输入图像描述

谁能告诉我到底发生了什么?任何帮助将不胜感激。谢谢

此致

4

1 回答 1

0

创建列表时,您永远不会将最终链接指针设置为 NULL。您将 temp 设置为 null 时,大概您想将 temp->next 设置为 null 。

在每次交易后将列表保持在有效状态会更加“稳健”。现在,您依靠循环内的 if 语句将最后一次迭代转换为“结束列表”操作,而不是“添加到列表”。如果有人要更改 for 循环限制而不更改该 if 语句以匹配,那么您将再次回到损坏的列表。尝试这样的事情:

Listnode *head = NULL; /* start with an empty list */
Listnode *tail = NULL;  

for (i=0; i<3; ++i)
{
    ListNode *temp = malloc(sizeof(Listnode));
    temp->item = i;
    temp->next = NULL;
    if (head == NULL)
        head = tail = temp;
    else
    {
        tail->next = temp;
        tail = temp;
    }
}

循环中还有 if 语句,但很有指导意义。循环体是您如何编写一个函数以将新列表条目推送到单链表的末尾。保留头指针和尾指针可以提高效率,避免循环查找列表末尾。

重点是无论循环怎么修改,循环每次迭代都会增加一个条目,并且列表在每次迭代结束时都是有效的。

于 2013-10-30T02:50:17.880 回答