почему этот код вызывает ошибку во время выполнения?

0
#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, но почти одинаковый код для создания связанного списка работал правильно.

Я использую dev c++ ide на окнах 8.

Конечно, укажите, не нравится ли вам этот вопрос, так как это мой первый раз.

  • 0
    что за ошибка?
  • 1
    Добро пожаловать в ТАК. Пожалуйста, используйте приличный заголовок для вашего вопроса, чтобы люди на первый взгляд увидели, о чем он. Как правило, вы можете получить пользу от просмотра текста справки на этом сайте, чтобы сначала узнать, как задавать вопросы, здесь.
Показать ещё 2 комментария
Теги:

3 ответа

0

Переменная "temp" указателя в функции createlist() используется без назначения при вызовах, следующих за первым вызовом. Вы можете воспользоваться опциями -Wall, если вы используете GCC.

0

При первом просмотре эта строка temp->next = p в функции createlist неверна, temp - это локальная переменная, хотя вы указываете на элемент, когда список создается в первый раз, когда значение теряется после createlist функции createlist, так что вы будете получать доступ к нежелательным адресам в последовательных вызовах createlist

  • 0
    но я скомпилировал почти тот же тип кода для создания связанного списка с указателем temp, и он работал правильно.
  • 1
    Он компилируется, потому что это не ошибка компиляции для доступа к любому адресу, который вы хотите. Во время выполнения (делает ./your_exe), если вы обращаетесь к недопустимым адресам, программа завершается ОС (как правило) ... как @Nabarun предлагает увидеть предупреждение вашего компилятора бросает, прежде чем запустить exableable
Показать ещё 4 комментария
-2

Может быть, вам следует изменить это:

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;
        }
    }
}
  • 0
    Что произойдет с temp после возврата функции ???
  • 0
    что здесь EOF?
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню