在C中使用指针到指针的链表实现



我无法在链表中添加新节点。我已经确定了问题所在,但经过大量的研究和尝试,我仍然无法解决这个问题。问题在于insert_node(char,struct **)函数和traverse(struct *)函数中的for循环,这两个函数似乎永远不会终止:

    // 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("nnEnter your name and hit enter-nn");
do{
printf("your name:");
fflush(stdin);
scanf("%c",&ch);
insertNode(ch,&head);
printf("nninsertnode-back to main()");
printf("Want to continue?(Y?N):");
fflush(stdin);
scanf("%c",&ans);
}while(ans=='y'||ans=='Y');
printf("nntraverselist-leaving main()");
traverselist(head);
printf("nntraverselist-back to main()");
return 0;
}
void insertNode(char c, LISTNODE **temp){
printf("nninto insertnode: before initialize");
LISTNODE* temp2;
newnode=initialize();
printf("nnback 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("nnIn while!");
}
*/
for(;*temp!=NULL;temp=&((*temp)->next))
    printf("nnIn for!") ;
//printf("nnout of while!");
(*temp)=newnode;
}
LISTNODE* initialize(){
static int count=0;
LISTNODE *tempnewnode;
printf("nnINto 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);
}
}

请帮忙!

问题在insert_node函数内部,特别是循环:

for(;*temp!=NULL;temp=&((*temp)->next))printf("nnIn for!");

最好不要在循环中使用引用temp,因为它会将head->next覆盖回自身。创建另一个临时指针

我将insertNode(char, LISTNODE**)更改为:

void insertNode(char c, LISTNODE *temp){
LISTNODE** temp2=&temp;
newnode=initialize();
printf("nnback to insertnode:after initialize");
newnode->name=c;
for(;(*temp2)!=NULL;temp2=&(*temp2)->next)
    printf("nnIn for!") ;
(*temp2)=newnode;
}

函数被这样调用:

insertNode(ch,head);

它工作得很好!

问题出在insertNode函数的这一部分

 for(;*temp!=NULL;temp=&((*temp)->next))
    printf("nnIn for!") ;
 //printf("nnout of while!");
     (*temp)=newnode;

在这里你应该首先检查链接列表是否为空,如果它是空的,那么你可以创建新的节点,并将它的地址分配给temp。如果不是,那么根据您是想在列表的末尾、开头还是中间插入新元素,您应该遍历列表,然后执行插入。例如,如果你想在开始时执行插入,那么在创建新节点后,你应该将列表的开始指针的地址分配给下一个新创建的节点,并将开始移动到新节点,因为你必须跟踪开始指针。

相关内容

  • 没有找到相关文章

最新更新