为什么这段代码会产生运行时错误?

时间:2014-02-17 10:02:32

标签: c++ c

#include<stdio.h>
#include<conio.h>
#include<windows.h>
struct node
{
    int a;
    struct node *next;
};

void createlist(struct node **head)
{
    struct node *p,*temp;
    int n;
    printf("enter the number\n");
    scanf("%d",&n);
    p=(struct node*)malloc(sizeof(struct node));
    p->a=n;
    if(*head==0) {
        *head=p;
        p->next=0;
        temp=p;
    }
    else {
        temp->next=p;
        temp=p;
        p->next=0;
    }
}

void frontbacksplit(struct node **head,struct node **head1,struct node **head2)
{
    int counter=0,i;
    struct node *temp,*p;
    temp=*head;
    while(temp!=0) {
        counter++;
        temp=temp->next;
    }   
    int n;
    if(counter%2==0) {
        n=counter/2;
    } else {
        n=(counter+1)/2;
    }
    temp=*head;
    for(i=0;i<n-1;i++) {
        if(*head1==0) {
            *head1=temp;
        }
        temp=temp->next;
    }
    p=temp;
    temp=temp->next;
    p->next=0;
    for(i=n+1;i<counter;i++) {
        if(*head2==0) {
            *head2=temp;
        }
        temp=temp->next;
    }
}

void display(struct node **head)
{
    struct node *temp;
    temp=*head;
    while(temp!=0) {
        printf("%d\t",temp->a);
        temp=temp->next;
    }   
    printf("\n");
}

int main()
{
    int n=1,i,k;
    struct node *head3,*head1,*head2;
    head3=0;
    head1=0;
    head2=0;
    while(n==1) {
        printf("enter \n1-To add the elements\n2-To split the list into front and        the back\n3-To display the elements\n");
        scanf("%d",&i);
        switch(i)
        {
            case 1:
                createlist(&head3);
                break;
            case 2:
                frontbacksplit(&head3,&head1,&head2);
                break;
            case 3:
                printf("enter\n1-To display front list\n2-To display rear list\n");
                scanf("%d",&k);
                switch(k)
                {
                    case 1:
                        display(&head1);
                        break;
                    case 2:
                        display(&head2);
                }
                break;
                default:
                printf("please enter a valid option\n");
        }
        printf("enter\n1-To continue\nany other number to exit\n");
        scanf("%d",&n);
    }
    getch();
    return 0;
}

我已编写此代码用于链接列表的前/后拆分。例如,如果列表是[1 2 3 4 5],则该程序将列表拆分为两个列表:前部分(1 2 3)和后部分(4 5),如果元素数量相等则两个部分都得到相同数量的元素。

问题:当我尝试在源列表中添加元素时,第一个元素会像往常一样添加,但是当我尝试添加其他元素时,我的程序会显示运行时错误。我认为指针变量temp存在问题,但创建链表的代码几乎相同。

我在Windows 8上使用dev c ++ ide。

当然,如果你不喜欢问这个问题的方式,请注意,因为这是我的第一次。

3 个答案:

答案 0 :(得分:0)

首先看temp->next = p函数中的这一行createlist是错误的,temp是一个局部变量,尽管你在第一次创建列表时指向该元素createlist函数返回后,该值将丢失,因此您将在连续调用createlist

时访问垃圾邮件地址

答案 1 :(得分:0)

在第一次调用之后的调用中,正在使用createlist()函数中的指针变量'temp'而不分配。如果您使用的是GCC,则可以使用-Wall选项。

答案 2 :(得分:-1)

也许你应该改为:

void createlist(struct node **head)
{
    struct node *p,*temp;
    int n;
    printf("enter the number\n");
    while(scanf("%d",&n) != EOF)
    {
        p=(struct node*)malloc(sizeof(struct node));
        p->a=n;
        if(*head==0)
        {
            *head=p;
            p->next=0;
            temp=p;
        }
        else
        {
            temp->next=p;
            temp=p;
            p->next=0;
        }
    }
}