Seven-H 2023-12-26 23:02 采纳率: 100%
浏览 8
已结题

List()函数出现问题——求帮


#include <stdio.h>
#include<stdlib.h>
#include<string.h>
#define Name_Size 20
#define Gender_Size 10
#define Tel_Size 20
#define City_size 30
#define Eip_Size 10

typedef struct {
    char Name[Name_Size];
    char Gender[Gender_Size];
    char Tel[Tel_Size];
    char City[City_size];
    char Eip[Eip_Size];
}Person;

typedef struct Node{
    Person data;
    struct Node *next;
}Node,*LinkList;


void Menu();   //菜单
void Quit();   //退出选单
Node *Create(); //创建新的通讯录
LinkList Add();    //在通讯录的末尾,写入新的信息,并返回选单
void Find(){}   //查询某人的信息,如果找到了,则显示该人的信息,如果未找到,则提示通讯录中没有此人的信息,并返回选单
void Alter(){}  //修改某人的信息,如果未找到要修改的人,则提示通讯录中没有此人的信息,并返回选单
void Delete(){} //删除某人的信息,如果未找到要删除的人,则提示通讯录中没有此人的信息,并返回选单
void List();   //显示通讯录中的所有记录

void Menu(){
    printf("***************************\n");
    printf("           通讯录          \n");
    printf("***************************\n");
    printf("---------------------------\n");
    printf("1.创建通讯录\n");
    printf("2.增添个人通讯信息\n");
    printf("3.查询个人通讯信息\n");
    printf("4.修改个人通讯信息\n");
    printf("5.删除个人通讯信息\n");
    printf("6.显示所有通讯信息\n");
    printf("0.退出\n");
    printf("---------------------------\n");
}



/*退出*/
void Quit(){
    printf("---------------------------\n");
    printf("           再见!           \n");
    printf("---------------------------\n");
}

/*创建通讯录*/
Node *Create(LinkList L){
    L=(LinkList)malloc(sizeof(Node));
    strcpy( (L)->data.City,"NULL");
    strcpy( (L)->data.Eip,"NULL");
    strcpy( (L)->data.Gender,"NULL");
    strcpy( (L)->data.Name,"NULL");
    strcpy( (L)->data.Tel,"NULL");
    (L)->next=NULL;
    printf("---------------------------\n");
    printf("创建通讯录成功!\n");
    printf("---------------------------\n");
    return L;
}

LinkList Add(LinkList L){
    Node *h,*r;
    r=L;     /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
    char flag='Y';
    while(flag=='Y'||flag=='y'){
        h=(Node*)malloc(sizeof(Node));
        printf("请输入姓名:");
        scanf("%s",&h->data.Name);
        printf("请输入性别:"); 
        scanf("%s",&h->data.Gender);
        printf("请输入电话:");
        scanf("%s",&h->data.Tel);
        printf("请输入城市:");
        scanf("%s",&h->data.City);
        printf("请输入邮编:");
        scanf("%s",&h->data.Eip);
        r->next=h;   /*连接首尾结点*/
        r=h;         /*更新表尾*/
        printf("是否继续增添信息?(Y/N):");
        scanf("%s",&flag);
    }
    r->next=NULL;
    return r;
}
/*求链表长度*/
int LenList(LinkList L){
    Node *p;
    int length=0;
    p=L->next;
    while(p){
        length++;
        p=p->next;
    }
    return length;
}

void List(LinkList s){
    Node *t;
    if(s==NULL||s->next==NULL){
        printf("此通讯录为空!\n");
        return ;
    }
    t=s->next;
    while(t!=NULL){
        printf("姓名:%19s 性别:%9s 电话:%19s 城市:%29s 邮编:%9s\n",t->data.Name,t->data.Gender,t->data.Tel,t->data.City,t->data.Eip);
        t=t->next;
    }
}

int main(){
    LinkList L;
    Node *p,*s;
    p=L;s=L;
    int op,bit=1;
    Menu();
    while(bit){
    Option:
        printf("请输入您选择的功能:");
        scanf("%d",&op);
        switch(op)
        {
            case 1 :
                p=Create(L);
                break;
            case 2 :
                p=Add(p);
                break;
            case 3 :
                Find();
                break;
            case 4 :
                Alter();
                break;
            case 5 :
                Delete();
                break;
            case 6 :
                List(s);
                break;
            case 0 :
                Quit();
                break;
            default :
                printf("您的选择有误!\n");
                printf("请重新选择!\n");     
                goto Option;
        }
        printf("是否继续其他功能?\n");
        printf("1.是  2.否\n");
        scanf("%d",&bit);
        if(bit==1){
            system("cls");
            Menu();
        }else{
            Quit();
            break;
        }
    }
    
    
    system("pause");
    return 0;
}

我的引用List()函数后会出现Segementation Fault,并且直接推出终端系统
但是编译并未出错
List()函数访问链表里存的数
请问一下哪里出现问题了??

img

  • 写回答

1条回答 默认 最新

  • qzjhjxj 2023-12-27 10:40
    关注

    问题不在list()函数里,修改如下,改动处见注释,供参考:

    #include <stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define Name_Size 20
    #define Gender_Size 10
    #define Tel_Size 20
    #define City_size 30
    #define Eip_Size 10
    
    typedef struct {
        char Name[Name_Size];
        char Gender[Gender_Size];
        char Tel[Tel_Size];
        char City[City_size];
        char Eip[Eip_Size];
    }Person;
    
    typedef struct Node {
        Person data;
        struct Node* next;
    }Node, * LinkList;
    
    
    void Menu();   //菜单
    void Quit();   //退出选单
    Node* Create(); //创建新的通讯录
    LinkList Add();    //在通讯录的末尾,写入新的信息,并返回选单
    void Find() {}   //查询某人的信息,如果找到了,则显示该人的信息,如果未找到,则提示通讯录中没有此人的信息,并返回选单
    void Alter() {}  //修改某人的信息,如果未找到要修改的人,则提示通讯录中没有此人的信息,并返回选单
    void Delete() {} //删除某人的信息,如果未找到要删除的人,则提示通讯录中没有此人的信息,并返回选单
    void List();   //显示通讯录中的所有记录
    
    void Menu() {
        printf("***************************\n");
        printf("           通讯录          \n");
        printf("***************************\n");
        printf("---------------------------\n");
        printf("1.创建通讯录\n");
        printf("2.增添个人通讯信息\n");
        printf("3.查询个人通讯信息\n");
        printf("4.修改个人通讯信息\n");
        printf("5.删除个人通讯信息\n");
        printf("6.显示所有通讯信息\n");
        printf("0.退出\n");
        printf("---------------------------\n");
    }
    
    
    
    /*退出*/
    void Quit() {
        printf("---------------------------\n");
        printf("           再见!           \n");
        printf("---------------------------\n");
    }
    
    /*创建通讯录*/
    Node* Create(LinkList L) {
        L = (LinkList)malloc(sizeof(Node));
        strcpy((L)->data.City, "NULL");
        strcpy((L)->data.Eip, "NULL");
        strcpy((L)->data.Gender, "NULL");
        strcpy((L)->data.Name, "NULL");
        strcpy((L)->data.Tel, "NULL");
        (L)->next = NULL;
        printf("---------------------------\n");
        printf("创建通讯录成功!\n");
        printf("---------------------------\n");
        return L;
    }
    
    LinkList Add(LinkList L) {
        Node* h, * r;
        r = L;     /*r指针动态指向链表的当前表尾,以便于做尾插入,其初值指向头结点*/
        if (!L) return NULL;         // 修改
        while (r->next) r = r->next; // 修改
        char flag = 'Y';
        while (flag == 'Y' || flag == 'y') {
            h = (Node*)malloc(sizeof(Node));
            h->next = NULL;        // 修改
            printf("请输入姓名:");
            scanf("%s", h->data.Name); // 修改
            //scanf("%s", &h->data.Name);
            printf("请输入性别:");
            scanf("%s", h->data.Gender); // 修改
            //scanf("%s", &h->data.Gender);
            printf("请输入电话:");
            scanf("%s", h->data.Tel);  // 修改
            //scanf("%s", &h->data.Tel);
            printf("请输入城市:");
            scanf("%s", h->data.City);  // 修改
            //scanf("%s", &h->data.City);
            printf("请输入邮编:");
            scanf("%s", h->data.Eip);  // 修改
            //scanf("%s", &h->data.Eip);
            r->next = h;   /*连接首尾结点*/
            r = h;         /*更新表尾*/
            printf("是否继续增添信息?(Y/N):");
            scanf(" %c", &flag);  // 修改
            //scanf("%s", &flag);
        }
        //r->next = NULL; 修改
        return L;  //return r; 修改
    }
    /*求链表长度*/
    int LenList(LinkList L) {
        Node* p;
        int length = 0;
        p = L->next;
        while (p) {
            length++;
            p = p->next;
        }
        return length;
    }
    
    void List(LinkList s) {
        Node* t;
        if (s == NULL || s->next == NULL) {
            printf("此通讯录为空!\n");
            return;
        }
        t = s->next;
        printf("%19s %9s %19s %29s %9s\n", "姓名", "性别", "电话", "城市", "邮编"); // 修改
        while (t != NULL) {
            printf("%19s %9s %19s %29s %9s\n", 
                t->data.Name, t->data.Gender, t->data.Tel, t->data.City, t->data.Eip); // 修改
            t = t->next;
        }
    }
    
    int main() {
        LinkList L = NULL; // 修改
        //Node* p, * s;   修改
        //p = L; s = L;   修改
        int op, bit = 1;
        Menu();
        while (bit) {
        Option:
            printf("请输入您选择的功能:");
            scanf("%d", &op);
            switch (op)
            {
            case 1:
                L = Create(L); //p = Create(L);  修改
                break;
            case 2:
                L = Add(L);  // p = Add(p); 修改
                break;
            case 3:
                Find();
                break;
            case 4:
                Alter();
                break;
            case 5:
                Delete();
                break;
            case 6:
                List(L);  // List(s); 修改
                break;
            case 0:
                Quit();
                break;
            default:
                printf("您的选择有误!\n");
                printf("请重新选择!\n");
                goto Option;
            }
            printf("是否继续其他功能?\n");
            printf("1.是  2.否\n");
            scanf("%d", &bit);
            if (bit == 1) {
                system("cls");
                Menu();
            }
            else {
                Quit();
                break;
            }
        }
        system("pause");
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 1月5日
  • 已采纳回答 12月28日
  • 创建了问题 12月26日

悬赏问题

  • ¥30 为什么会失败呢,该如何调整
  • ¥15 前端返回pdf时不显示内容
  • ¥50 如何在不能联网影子模式下的电脑解决usb锁
  • ¥20 服务器redhat5.8网络问题
  • ¥15 如何利用c++ MFC绘制复杂网络多层图
  • ¥20 要做柴油机燃烧室优化 需要保持压缩比不变 请问怎么用AVL fire ESE软件里面的 compensation volume 来使用补偿体积来保持压缩比不变
  • ¥15 python螺旋图像
  • ¥15 算能的sail库的运用
  • ¥15 'Content-Type': 'application/x-www-form-urlencoded' 请教 这种post请求参数,该如何填写??重点是下面那个冒号啊
  • ¥15 找代写python里的jango设计在线书店