C中的单链表(插入节点)

时间:2015-07-29 13:03:41

标签: c singly-linked-list

我输入时遇到此问题。该程序将冻结,弹出窗口将打开并说“" .exe已停止工作。 "

它只是一个简单的插入和显示单链表的功能。我尝试了一切。我重写了代码并找到了另一种插入方式。我尝试了不同的编译器..它适用于turbo C,但我使用的是devC ++。

  • 这是编译错误吗?

以下是代码:

#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include<windows.h>
#include <string.h>

typedef struct process
{
    int pNum;
    struct process *next;
}node;


node *create_node(node x)
{
    node *temp;
    temp=(node *)malloc(sizeof(node));

    if(temp==NULL)
    {
        return 0;
    }
    else
    {

        temp->pNum=x.pNum;
        temp->next=NULL;


    }
    return temp;
}


node *insert_node(node *head,node *last,node x)
{
    node *temp;

    temp=create_node(x);

    if(head==NULL && head==last)
    {
        head=temp;
        last=temp;
        head->next=NULL;
        last->next=NULL;
    }
    else
    {
        last->next=temp;
        last=temp;
        last->next=NULL;

    }

    return head;
}

int main()
{
    node *head=NULL,*last=NULL,*temp,input;
    int i,x,y,num;

    printf("INPUT NUMBER: ");
    scanf("%d",&num);


    x=0;
    y=6;

    for(i=0;i<num;i++)
    {

        gotoxy(39,y);
        scanf("%d",&input.pNum);

        head=insert_node(head, last, input);

        y++;
    }
    getch();
    return 0;
}

我想我已经发现它停止工作的路线了。 在函数insert_node

last->next=temp;

似乎我无法找到我做错的事。

2 个答案:

答案 0 :(得分:2)

在您的代码中,在第一个条目后,头指针将指向新值。因为您正在分配该调用函数的返回值。但最后的价值不会受到影响。因为你把它称为价值传递。在 下次头==最后一次会失败。

它将转到else块,并且您正在访问

 last->next=temp;

就像访问null指针一样,这就是原因。如果你需要避免这种情况,你需要调用last作为参考传递。

答案 1 :(得分:2)

你需要这个:

node *insert_node(node *head, node **last, node x)
{
    node *temp;

    temp=create_node(x);

    if(head==NULL && head== *last)
    {
        head=temp;
        *last=temp;
        head->next=NULL;
        (*last)->next=NULL;
    }
    else
    {
        (*last)->next=temp;
        (*last)=temp;
        (*last)->next=NULL;

    }

    return head;
}

这样打电话:

head=insert_node(head, &last, input);

您的函数需要修改last指针。在C值中包括指针通过值传递。因此,如果修改函数内部的函数参数,则不会修改传递给函数的参数。这就是您的计划中发生的事情。

在修改过程中,我们不会简化last指针,但是我们传递一个指向last指针的指针,这将允许我们修改last的{​​{1}}指针功能。

简单示例:

main

将打印:

int func1(int x)
{
  x = 10;
  return 2;
}

int func2(int *x)
{
  *x = 10;
  return 2;
}

...
int x = 3;
printf ("%d\n", func1(x));
printf ("%d\n", x);
printf ("%d\n", func2(&x));
printf ("%d\n", x);