Реализация связанного списка с использованием указателя на указатель в C
Я не могу добавить новый узел в связанный список. Я уже определил проблемную область, но после долгих исследований и попыток многих вещей я все еще не могу решить проблему. Проблема заключается в цикле for в функции insert_node(char,struct **) и функции traverse(struct *), которые никогда не заканчиваются:
// program that stores name of the user using linkedlist
#include<stdio.h>
#include<stdlib.h>
typedef struct LIST{
int flag;
char name;
struct LIST *next;
} LISTNODE;
LISTNODE *head=NULL,*newnode=NULL;// global pointers
LISTNODE* initialize(); //initializes struct node with default values and returns a node
void insertNode(char c,LISTNODE** temp);
void traverselist(LISTNODE *temp);
int main(){
char ans,ch;
printf("\n\nEnter your name and hit enter-\n\n");
do{
printf("your name:");
fflush(stdin);
scanf("%c",&ch);
insertNode(ch,&head);
printf("\n\ninsertnode-back to main()");
printf("Want to continue?(Y?N):");
fflush(stdin);
scanf("%c",&ans);
}while(ans=='y'||ans=='Y');
printf("\n\ntraverselist-leaving main()");
traverselist(head);
printf("\n\ntraverselist-back to main()");
return 0;
}
void insertNode(char c, LISTNODE **temp){
printf("\n\ninto insertnode: before initialize");
LISTNODE* temp2;
newnode=initialize();
printf("\n\nback to insertnode:after initialize");
//printf("\nnewnode->name=%c",newnode->name);
//printf("\nnewnode->flag=%d",newnode->flag);
newnode->name=c;
//printf("\nnewnode->name=%c",newnode->name);
//printf("\nnewnode->flag=%d",newnode->flag);
//for(;(*temp)!=NULL;temp=&(*temp)->next);
/*while((*temp)->next!=NULL){
temp=&(*temp)->next;
printf("\n\nIn while!");
}
*/
for(;*temp!=NULL;temp=&((*temp)->next))
printf("\n\nIn for!") ;
//printf("\n\nout of while!");
(*temp)=newnode;
}
LISTNODE* initialize(){
static int count=0;
LISTNODE *tempnewnode;
printf("\n\nINto inintialize!");
tempnewnode=(LISTNODE*)malloc(sizeof(LISTNODE));
if(tempnewnode==NULL){
printf("No memory available. Aborting!");
exit(0);
}
else{
tempnewnode->flag=0;
tempnewnode->name='*';
tempnewnode->next=NULL;
if(count==0){
head=tempnewnode;
count++;
}
}
return tempnewnode;
}
void traverselist(LISTNODE *temp){
printf("\n");
for(;temp!=NULL;temp=temp->next){
printf("%c",temp->name);
}
}
Пожалуйста помоги!
3 ответа
Проблема заключается в функции insert_node, особенно в цикле:
for(;*temp!=NULL;temp=&((*temp)->next))
printf("\n\nIn for!");
Вам бы лучше не использовать опорный темп в вашем цикле, так как он перезаписывает заголовок -> рядом с собой. Создайте еще один временный указатель.
Я изменил insertNode(char, LISTNODE**) следующим образом:
void insertNode(char c, LISTNODE *temp){
LISTNODE** temp2=&temp;
newnode=initialize();
printf("\n\nback to insertnode:after initialize");
newnode->name=c;
for(;(*temp2)!=NULL;temp2=&(*temp2)->next)
printf("\n\nIn for!") ;
(*temp2)=newnode;
}
и функция вызывается так:
insertNode(ch,head);
Работает просто отлично!
Проблема в том, что эта часть вашей функции insertNode
for(;*temp!=NULL;temp=&((*temp)->next))
printf("\n\nIn for!") ;
//printf("\n\nout of while!");
(*temp)=newnode;
Здесь вы должны сначала проверить, является ли список ссылок пустым или нет, если он пуст, тогда вы можете создать новый узел и назначить его адрес для temp. Если нет, то в зависимости от того, хотите ли вы вставить новый элемент в конец, начало или середину списка, вы должны просмотреть список, а затем выполнить вставку. Например, если вы хотите выполнить вставку в начале, то после создания нового узла вы должны назначить адрес указателя начала списка следующему вновь созданному узлу и переместить начало на новый узел, так как вы должны отслеживать указателя начала.