链表:如何在完成后返回整个链表

时间:2018-04-08 14:22:44

标签: c singly-linked-list

我正在尝试在以下程序的Insert函数中返回链表的头部。但是,它因编译错误而失败。 谁能告诉我我做错了什么:

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

struct ListNode
{
    int data;
    struct ListNode *next;
};


int ListLength(struct ListNode *head)
{
    int count = 0;
    struct ListNode *temp=head;
    while(temp!=NULL)
    {
        count++;
        temp=temp->next;
    }
    return count;
}

struct ListNode *Insert(struct ListNode *head, int value, int pos)
{
    struct ListNode *temp,*curr;
    curr=head;
    int k=1;
    temp=(struct ListNode *)malloc(sizeof(struct ListNode));
    if(pos==1)
    {
        temp->data=value;
        if(head==NULL)
        {
            temp->next=NULL;
            head=temp;
        }
        else
        {
            temp->next=head;
            head=temp;
        }
    }
    else
    {
        while((curr!=NULL) && (k<pos))
        {
            k++;
            curr=curr->next;
        }
        temp->data=value;
        temp->next=curr->next;
        curr->next=temp;

    }
    return head;
}
void printList(struct ListNode *head)
{
    struct ListNode *temp;
    temp=head;
    while(temp!=NULL)
    {
        printf("%d",temp->data);
        printf(" ");
        temp=temp->next;
    }
}
int main
{
    struct ListNode *head=NULL;
    //head = NULL;
    head=Insert(head,10,1);
    //Insert(head,11,2);
    printList(head);

    return 0;
}

我试图在插入后返回新链表的头部。我不知道我哪里出错了。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

(i)首先,请在评论中提及int main(void)

(ii)接下来,使用当前代码,当您尝试打印列表时,您将处于无限循环中并获得堆栈溢出。

为避免这种情况,请在每次打印后将temp增加指向下一个节点。

因此,您的打印功能应如下所示:

void printList(struct ListNode *head)
{
    struct ListNode *temp;
    temp=head;
    while(temp!=NULL)
    {
        printf("%d",temp->data);
        printf(" ");
        temp=temp->next; // this line is required
    }
}

(iii)在你的main函数中,用一个参数调用printList,这就是节点的头部:

printList(head);

(iv)并且不要忘记在查找列表函数的长度时返回count。在ListLength函数的末尾添加return语句:

return count;

(v)当前代码不处理head为NULL且用户想要插入大于1的位置的情况。或者更一般地,当用户想要插入位置时大于当前列表的长度。

虽然您信任不会给出这样的输入,但始终处理此类异常(在尝试访问空节点的内存时,您可能会在此处获得SEGMENTATION FAULT

要处理此问题,您可以在Insert函数的开头添加一个检查,例如

int lenList = ListLength(head);
if (lenList < pos)
    {
        printf("Please provide a position less than %d to insert", lenList);
        return 0; // don't proceed with inserting node with NULL pointers
    }

答案 1 :(得分:-1)

如果头部被宣布为全球,则您不必将其归还。 (对不起,我的答案很简短)