C语言编电话薄,只开了个头。为什么运行不了

#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;
}