2016-10-17 2 views
1

Я написал программу для выполнения односвязаны операций списка insert at a particular positionтеперь нет узлов в данный момент, когда я даю вход: 3 вопросу enter the position to be inserted он показывает сообщение об ошибке выполненияодносвязаны операции списка вставка в определенной позиции

void insert_pos() 
    { 
     struct node * temp, *loc; 
     int item,pos,len; 
     printf("enter the position to be insertd :"); 
     scanf("%d", &pos); 
     if (pos == 1) 
     { 
      insert_beg(); 
     } 
     else 
     { 
      len = length(); 
      if (start == NULL) 
      { 
       insert_beg(); 
      } 
      else if (pos > len) 
      { 
       insert_end(); 
      } 
      else 
      { 
       newnode = (struct node *)malloc(sizeof(struct node)); 
       printf("enter the data :"); 
       scanf("%d", &item); 
       newnode->data = item; 
       int i; 
       temp = start; 
       loc = temp->next; 
       for (i = 1; i < pos - 1; i++) 
       { 
        temp = temp->next; 
        loc = loc->next; 
       } 
       temp->next = newnode; 
       newnode->next = loc; 
      } 
     } 
    } 
    int length() 
    { 
     int k = 1; 
     struct node * temp; 
     while (temp->next != NULL) 
     { 
      temp = temp->next; 
      k++; 
     } 
     return k; 
    } 

из положить

1.insert @ beg 
2.insert @ end 
3.insert @ perticular pos 
4.display 
5.exit 
enter your option :3 
enter the position to be inserted :3 

теперь всплывает окно отладки говоря об ошибке Просьба помочь мне с этим

+0

«Ошибка выполнения» - это сбой. Вы решаете их, сначала выясняя, где в вашем коде происходит авария. Вы делаете это, работая в отладчике и ловя крах «в действии». Когда в отладчике и попав в ловушку, вы можете проверить значения задействованных переменных, чтобы увидеть, являются ли они такими, какие вы ожидаете от них. –

+3

Функция 'int length()' вызывает UB: 'struct node * temp' содержит мусор, это недействительный указатель. Затем вы разыскиваете его ('temp-> next') ... это никогда не будет вести себя так, как вы хотите, чтобы оно было –

+2

Но вот вам подсказка: Неинициализированные переменные имеют * неопределенные значения *, а их использование приводит к * неопределенному поведению * , что является общей причиной сбоев. –

ответ

0

проблема была здесь температура была Uninitialized

int length() 
{ 
    int k = 1; 
    struct node * temp; 
    while (temp->next != NULL) 
    { 
     temp = temp->next; 
     k++; 
    } 
    return k; 
} 

исправление было назначить temp = start;

исправленных программу

int length() 
{ 
    int k = 1; 
    struct node * temp; 
    temp=start; // start is a global variable 
    while (temp->next != NULL) 
    { 
     temp = temp->next; 
     k++; 
    } 
    return k; 
} 

благодарит каждый из для советов !!!

+0

Если' start' не является глобальной переменной, это все равно будет проблемой (как и ' insert_beg' и 'insert_end' BTW). Лучше всего здесь сделать _pass указатель на list_ как аргумент: 'int length (struct node * list) {int k = 0; if (list == NULL) return k; while (list-> next! = NULL) {k ++; list = list-> next; } return k;} ' –

+0

yaa start - глобальная переменная –