代码:
#include<stdio.h>
#include<malloc.h>
struct details{
char *name;
int no;
struct details *info;
};
//ADDING THE LINKED LIST
void add(struct details **info,int no,char * name){
struct details *temp=malloc(sizeof(struct details));
temp = *info;
if(temp == NULL){
temp = malloc(sizeof(struct details));
}
else{
if(temp->info == NULL){
temp->info = malloc(sizeof(struct details));
temp = temp->info;
}
}
temp->no = no;
temp->name = name;
}
//DISPLAYING THE LINKED LIST
void display(struct details *info){
while(info!=NULL){
printf("\nThe List is:\n","\n no: \tname:\n","%d","%s and link:%d",info->no,info->name,info->info);
info = info->info;
}
}
//MAIN PROGRAM
int main()
{
struct details* ptr;
char *name,ch;
int no;
int select_option;
ptr = NULL;
printf("\n ***MAIN MENU*** \n1.Add Element \n2.Delete Element \n3.Search Element \n4.Linked List Concatenation \n5.Invert Linked List \n6.Diplay Elements \n Please Enter your choice:(eg:1,2,3,4,5,6)\n");
scanf("%d",&select_option);
do{
switch(select_option){
case 1:
printf("Enter no to add:");
scanf("%d",&no);
printf("Enter name to add:");
scanf("%s",name);
add(&ptr,no,name);
break;
case 6:
display(ptr);
break;
default:
printf("INVALID CHOICE!");
break;
}
printf("Do u wish to continue?(y/n):");
scanf("%c",&ch);
}while(ch == 'y' || ch == 'y');
return 0;
}
我尝试使用链接列表编写一个简单的程序来添加和显示数据。但它给我一个分段错误。我希望我已经用内存初始化了所有指针。所有帮助表示赞赏。
答案 0 :(得分:3)
此:
temp->name = name;
不会将name
复制到temp->name
,但会将temp->name
分配到与name
相同的地址,这是该函数的本地地址。您需要malloc()
和strcpy()
:
temp->name = malloc(strlen(name) + 1);
strcpy(temp->name, name);
在不再需要时请记住free(temp->name);
。
此外(正如Luchian所指出的),从stdin
阅读时:
char *name;
...
scanf("%s",name);
name
没有分配内存。将它声明为一个数组,但你需要防止写入超出它的结尾:
char name[128];
...
scanf("%127s",name);
答案 1 :(得分:2)
你还没有:
char *name;
///....
scanf("%s",name);
您从未为name
分配内存。
你可以做char name[50];
或其他什么,但要注意溢出。警惕他们。
答案 2 :(得分:1)
hmjd 和 Luchian Grigore 答案都是先前的问题,但也是:
您不会在temp->info
之后的任何时候初始化malloc
,因此它永远不会NULL
,但temp->info
是无效的地址。
要么显式初始化它,要么使用calloc
来初始化已分配的缓冲区,而不是malloc
。
答案 3 :(得分:1)
您忘了分配name
char *name