#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node
{
char pname[20];
char pnum[12];
char pindex[30];
struct Node* next;
} Phone;
// 初始化
void Initialize(Phone* list)
{
list = (Phone*)malloc(sizeof(Phone));
list->next=NULL;
}
// 添加记录
void Add(Phone* list, char* name, char* num, char* index)//const限制一个变量不允许改变,起到静态变量的作用
{
Phone* p,p1;
for (p = list; p->next != NULL; p = p->next);
p1 = (Phone)calloc(sizeof(Phone),1);
strcpy(p1->pname, name);
strcpy(p1->pnum, num);
strcpy(p1->pindex, index);
p1->next=p->next;
p->next=p1;
printf("%s,%s,%s\n", p1->pname, p1->pnum, p1->pindex);
}
int main()
{
Phone* list;
Initialize(&list);
int i;
Phone *p;
int n;
printf("输入联系人个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s,%s,%s\n", &p->pname,&p->pnum,&p->pindex);
Add(list,p->pname,p->pnum,p->pindex);
printf("%s,%s,%s\n", p->pname, p->pnum, p->pindex);
p=p->next;
}
return 0;
}
好像是因为给结构分配内存出现了错误,修改了一下,如下:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node
{
char pname[20];
char pnum[12];
char pindex[30];
struct Node* next;
} Phone;
// 初始化
void Initialize(Phone** list)
{
*list = (Phone*)malloc(sizeof(Phone));
(*list)->next=NULL;
}
// 添加记录
void Add(Phone* list, char* name, char* num, char* index)//const限制一个变量不允许改变,起到静态变量的作用
{
Phone* p,*p1;
for (p = list; p->next != NULL; p = p->next);
// printf("0\n");
p1 = (Phone *)malloc(sizeof(Phone));
// printf("1\n");
strcpy(p1->pname, name);
strcpy(p1->pnum, num);
strcpy(p1->pindex, index);
// printf("2\n");
p1->next=p->next;
p->next=p1;
// printf("3\n");
// printf("%s,%s,%s\n", p1->pname, p1->pnum, p1->pindex);
}
int main()
{
Phone* list;
char pname[20];
char pnum[12];
char pindex[30];
printf("list=%p\n",list);
Initialize(&list);
printf("list=%p\n",list);
int i;
Phone *p;
int n;
printf("输入联系人个数:");
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%s %s %s", pname,pnum,pindex);
Add(list,pname,pnum,pindex);
// printf("%s,%s,%s\n", pname, pnum, pindex);
// p=p->next;
}
//打印结果
p = list->next;
for(i=0;i<n;i++){
if(p!=NULL){
printf("%s %s %s\n",p->pname,p->pnum,p->pindex);
p=p->next;
}
}
return 0;
}
代码我简单调试了一下,能运行了。
从你的代码,简单说几个:
1: 你对你想实现得业务得具体实现流程模糊,比如初始化链表,插入链表得具体动作,这个你需要梳理一下,可以用文字写出来啊。
2:函数传参指针和变量得知识点,比如初始化时,函数传参指针传空,这个。。。 其实最好用返回值得方式,我这里用得也比较简单。
3:结构体得两种访问方式知识点,直接访问用.和间接访问用->
4:c语言字符串得概念,以及c语言字符串与字符数组得关系,用scanf格式化输入字符串时,应该怎么输入的知识点。
这几个知识点就是你对应问题的知识点,也是基础,你可以单个整理和反思一下,也就是你代码的问题。
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct Node
{
char pname[20];
char pnum[12];
char pindex[30];
struct Node* next;
} Phone;
// 初始化
void Initialize(Phone** list)
{
(*list) = (Phone*)malloc(sizeof(Phone));
(*list)->next = NULL;
}
// 添加记录
void Add(Phone* list, char* name, char* num, char* index)//const限制一个变量不允许改变,起到静态变量的作用
{
Phone* p, *p1;
for (p = list; p->next != NULL; p = p->next);
p1 = (Phone *)calloc(sizeof(Phone), 1);
strcpy(p1->pname, name);
strcpy(p1->pnum, num);
strcpy(p1->pindex, index);
p1->next = p->next;
p->next = p1;
printf("%s,%s,%s\n", p1->pname, p1->pnum, p1->pindex);
}
int main()
{
Phone* list = NULL;
Initialize(&list); // 默认是NULL 这里你要用得话 要注意啊 函数得设置也要注意啊
int i;
Phone p;
int n;
printf("输入联系人个数:");
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%s%s%s", (&p)->pname, (&p)->pnum, (&p)->pindex); //注意用法啊 scanf得用法以及结构体元素访问方式得用法
Add(list, p.pname, p.pnum, p.pindex);
printf("%s,%s,%s\n", p.pname, p.pnum, p.pindex);
// p = list->next; //这个思路是想干嘛
}
return 0;
}