为什么这个链接列表代码出现故障?

时间:2017-06-27 16:26:22

标签: c linked-list

我在c中编写了这段代码来实现链表。虽然语义和语法都很好,但它不能正常工作。例如,当我在列表中插入1然后打印链表时,它会显示该列表为空。

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

struct node {
    int info;
    struct node *next;
}; typedef struct node Node;


void addNode(Node *head, int x)
{
        Node *temp;
        temp=malloc(sizeof(temp));
        temp->info=x;
        if (head==NULL)//if this is the first node in the list
        {
            head=temp;
            temp->next=NULL;

        }
        else //if not, add it as the head
        {
            temp->next=head;
            head=temp;
        }
}

void appendNode(Node *head, int x)
{
    Node *rear =head;
    Node *temp= malloc(sizeof(temp));
    temp->info=x;
    temp->next=NULL;
    while (rear->next!=NULL)
        rear=rear->next;
    rear->next=temp;
    rear=temp;

}

void insertNodeafter(Node *head, int location, int x)
{
    int i;
    Node *before, *after = head;
    Node *temp= malloc(sizeof(temp));
    temp->info=x;

    for (i=0;i<location;i++)
        before=before->next;
    after=before->next;
    temp->next=after;
    before->next=temp;

}

void insert(Node *head, int x)
{
    int c=0;
    Node *temp;
    temp=head;
    if(temp==NULL)
    {
    addNode(temp,x);
    }
    else
    {
    while(temp!=NULL)
    {
        if(temp->info<x)
        c++;
        temp=temp->next;
    }
    if(c==0)
        addNode(temp,x);
    else if(c<listSize())
        insertNodeafter(temp,x,++c);
    else
        appendNode(temp,x);
    }
}

int listSize()
{
    Node *head, *n;
    int c=0;
    n=head;
    while(n!=NULL)
    {
    n=n->next;
    c++;
    }
    return c;
}

void DisplayLinkedList(Node* head)
{
    Node *rear=NULL;
    if (head==NULL)
        printf("list is empty!\n");
    else
    {
        rear=head;
        while (rear!=NULL)
            printf("%d |---> ", rear->info);
            rear=rear->next;
    }


}

int getNextNode(Node *head)
{
    if (head == NULL)
        return -1;
    else
        return head->next->info;
}

Node* deleteNode(Node *head, int x)
{
    Node *temp;
    if (head == NULL)
        return NULL;

    else
        {
            if (head->info==x)
                {
                temp = head->next;
                free(head);
                head=temp;
                return head;
                }
            else
                {
                deleteNode(head->next,x);
                return head;
                }
        }
}

void main()
{
    int i=0;
    Node *myNode;
    insert(myNode,1);
    DisplayLinkedList(myNode); 

}

2 个答案:

答案 0 :(得分:1)

因为您使用Node*变量而不是在函数参数中使用Node**变量。由于您使用的是Node*,因此变量head中的更改对于该函数是本地的。如果你想在函数调用之后反映这些变化(你显然想要),那么使用Node**并在你的代码中相应地使用它。

答案 1 :(得分:-1)

正如上一张海报所提到的,最好使用Node **变量来反映函数调用后的变化。如果您想使用Node *,则必须将Node *返回main以从中进行打印。

我减少了代码,使用AddNode,insert和DisplayLinkedList添加1,现在可以正确显示下面的代码。

您还应该在main中将Node *设置为NULL以初始化空链表。检查您的DisplayLinkedList函数 - 您在while循环中缺少大括号。它只是读取printf行而不是遍历列表,导致无限循环。

最佳做法是在创建此程序时进行调试和测试。

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

void main()
{
    int i=0;
    Node *myNode;
    myNode = NULL;
    insert(&myNode,1);
    DisplayLinkedList(myNode);
}

void addNode(Node **head, int x)
{
    Node *temp;
        temp=malloc(sizeof(temp));
        temp->info=x;
        if (*head==NULL)//if this is the first node in the list
        {
            *head=temp;
            temp->next = NULL;
        }
        else //if not, add it as the head
        {
            temp->next=*head;
            *head=temp;
        }
}

void insert(Node **head, int x)
{
    int c=0;
    Node *temp;
    temp=*head;
    if(temp==NULL)
    {
        addNode(head ,x);
    }
}

void DisplayLinkedList(Node* head)
{
    Node *rear=NULL;
    if (head==NULL)
        printf("list is empty!\n");
    else
    {
        rear=head;
        while (rear!=NULL)
    {
            printf("%d |---> ", rear->info);
            rear=rear->next;
    }
    }
}