2016-09-26 10 views
0

Это метод, который я написал в C. Он предназначен для вставки в связанном списке.Вставка в круглый связанный список (вывод не подходит по желанию)

void insert_beg() 
{ 
temp=(struct node*)malloc(sizeof(struct node)); 
ptr=(struct node*)malloc(sizeof(struct node)); 

int data_value; 

printf("Enter the value\n"); 
scanf("%d",&data_value); 

temp->info=data_value; 

if(header->link==NULL)//when there is no node 
{ 
    header->link=temp; 
    temp->link=header; 
} 
else//when atleast one node has been created 
{ 
    ptr->link=header->link;//ptr is pointing to where header was pointing. 
    header->link=temp; 
    temp->link=header; 
} 

printf("\n\n"); 
} 

Это код для обхода (в основном отображения)

void traverse() 
{ 
ptr=header->link; 

while(ptr->link!=header) 
{ 
    ptr=ptr->link; 
    printf("%d\t",ptr->info); 
} 
printf("\n\n"); 
} 

При запуске программы, выход для обхода ничего. Это похоже на то, что цикл for не работает. При вставке или какой-либо другой вещи отсутствует ошибка сегментации. Правильно ли моя логика? Если нет, то где я иду не так?

+0

Я думаю, что условие должно быть 'if (header == NULL)'. Затем 'temp-> link = ptr-> link'. В противном случае вы потеряете исходную 'header-> link' – Sharad

+0

в функции' insert_beg', почему создаются два объекта 'node'? – PRP

+0

@PRP, когда я удалял объект ptr, возникает проблема с другой частью кода. У меня возникла ошибка сегментации. Вот почему .. – sindhugauri

ответ

1

Исходное значение header->link теряется из-за неправильных назначений. Также вам не нужно malloc для переменной ptr. Измените блок if/else.

if (header == NULL){ 
    header = temp 
    header->link = temp 
} 
else//when atleast one node has been created 
{ 
    ptr=header->link;//ptr is pointing to where header was pointing. 
    header->link=temp; 
    temp->link=ptr; 
} 

В основном вы всегда пытаетесь добавить на второй позиции с else block, но вместо того, чтобы старые данные на третье место вы указываете ваш второй обратно к голове.

Я также вижу некоторые фундаментальные проблемы с вышеуказанным кодом. Код не принимает указательную переменную и не возвращает никакого указателя. Как только функция вернется, невозможно получить доступ к данным.

Если заголовок является глобальной переменной, то это должно быть изменение. malloc из temp и все остальное связано с temp должен перемещаться внутри else блока, как мы не нужны для if части

if (header->link == NULL){ 
    header->data = data 
    header->link = header 
} 

Если заголовок не является глобальной переменной, то для решения полной задачи, функция должна быть изменена as

void insert_beg(struct node **header_dptr) #A double pointer 
{ 
    header = *header_dptr 
    temp=(struct node*)malloc(sizeof(struct node)); 
    int data_value; 

    printf("Enter the value\n"); 
    scanf("%d",&data_value); 

    temp->info=data_value; 

    if(header==NULL)//when there is no node 
    { 
     header=temp; 
     header->link=temp; 
    } 
    else//when atleast one node has been created 
    { 
     ptr=header->link;//ptr is pointing to where header was pointing. 
     header->link=temp; 
     temp->link=ptr; 
    } 

printf("\n\n"); 
} 
+0

можем ли мы сделать ссылку «temp-> link = header->; header-> link = temp; ', чтобы избежать временного указателя? – PRP

+0

Да, мы можем это сделать, но я сохранил исходный код, чтобы ОП понимал ошибку в исходном коде. – Sharad

+0

@Sharad Я получаю ошибку сегментации с этим кодом. (на обход). Кроме того, в чем разница между header-> link = temp и header = temp? Извините, если это звучит глупо, но я действительно запутался прямо сейчас. – sindhugauri

 Смежные вопросы

  • Нет связанных вопросов^_^