| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1412 人关注过本帖
标题:编写了一个通讯录程序,创建通讯录后就段错误,求大神指点
只看楼主 加入收藏
zhitongze
Rank: 1
等 级:新手上路
帖 子:24
专家分:6
注 册:2016-4-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:3 
编写了一个通讯录程序,创建通讯录后就段错误,求大神指点
#include "stdio.h"
#include "string.h"
#include "stdlib.h"

typedef struct
{
    char name[15];
    char phone[13];
    char adrr[20];
}datatype;
typedef struct node
{
    datatype data;
    struct node *next;
}listnode;
typedef listnode *linklist;
linklist head;
listnode *p;
//===============================================声明函数==================================================
int menu();                                    //菜单
linklist Creat(void);                        //创建通讯录
void Insert(linklist head,listnode *p);        //插入联系人(创建会覆盖掉原本的,所以插入)
listnode *Find(linklist head);                //查找联系人
void Delete(linklist head);                 //删除结点(联系人)
void Print(linklist head);                    //遍历打印
//===============================================主函数=====================================================
int main()
{
    for(;;)
    {
        switch(menu())
        {
            case 1:
                printf("****************************************\n");
                printf("*           通讯信息的创建             *\n");
                printf("****************************************\n");
                head=Creat();
                break;
            case 2:
                printf("****************************************\n");
                printf("*           通讯信息的添加             *\n");
                printf("****************************************\n");
                printf(" 姓名    号码    地址\n");
                printf("****************************************\n ");
                p=(listnode *)malloc(sizeof(listnode));             //申请新的结点
                scanf("%s%s%s",&p->data.name,&p->data.phone,&p->data.adrr);
                Insert(head,p);
                break;
            case 3:
                printf("***************************************\n");
                printf("*           通讯信息的查询            *\n");
                printf("***************************************\n");
                p=Find(head);
                if(NULL != p)
                {
                    printf("姓名    号码    地址\n");
                    printf("***********************************\n");
                    printf("%s    %s    %s\n",p->data.name,p->data.phone,p->data.adrr);
                    printf("***********************************\n");
                }
                else
                {
                    printf("没有查到要查询的通讯者!\n");   
                }
                break;
            case 4:
                printf("***************************************\n");
                printf("*           通讯信息的删除            *\n");
                printf("***************************************\n");
                Delete(head);
                break;
            case 5:
                printf("***************************************\n");
                printf("*           通讯信息的输出            *\n");
                printf("***************************************\n");
                Print(head);
                break;
            case 0:
                printf(" 谢谢使用,再见!\n");
                return 0;        
        }   
    }
    return 0;
}
//===============================================子函数=====================================================
//---------------------------建立菜单--------------------------------
int menu()
{
    int sel;
    printf("\n        通讯录管理系统\n");
    printf("========================================\n");
    printf("        1.通讯信息的建立\n");
    printf("        2.通讯信息的添加\n");
    printf("        3.通讯信息的查询\n");
    printf("        4.通讯信息的删除\n");
    printf("        5.通讯信息的输出\n");
    printf("        0.退出\n");
    printf("========================================\n");
    printf("    请选择:(0-5)    ");
    for( ; ; )
    {
        scanf("%d",&sel);
        if(sel>5 || sel<0)
        {
            printf("input error!    please input 0-5!\n");
        }   
        else                 
            break;
    }   
    return sel;
}
//----------------------用尾插法建立链表函数-------------------------
linklist Creat(void)
{
    linklist head=(listnode *)malloc(sizeof(listnode));        //申请头结点
    listnode *p,*q;
    int flag=0;
    q=p;
    while(0==flag)
    {
        p=(listnode *)malloc(sizeof(listnode));
        printf("姓名    手机号码    地址\n");
        printf("****************************************\n");
        scanf("%s%s%s",&p->data.name,&p->data.phone,&p->data.adrr);
        q->next=p;
        q=p;
//        p=p->next;
//        q=p;
        printf("        是否结束创建 ? (0/1)    ");
        scanf("%d",&flag);   
    }
    q->next=NULL;
    return head;
}
//-------------------------插入通讯信息------------------------------
void Insert (linklist head,listnode *p)
{
    listnode *p1,*p2;
    p1=head;
    p2=p1->next;
    while ((NULL != p2) && strcmp(p2->data.name,p->data.name))
    {
        p1=p2;
        p2=p2->next;
    }
    p1->next=p;    //插入p所指向的结点
    p->next=p2;    //连接表中剩余的结点
}
//-----------------------------查找----------------------------------
listnode *Find(linklist head)
{
    listnode *p;
    char name[15];
    printf("***************************************\n");
    printf("    请输入待查找通讯人的姓名:                \n");
    p=head->next;
    scanf("%s",name);
    while(p&&strcmp(p->data.name,name)!=0)
    p=p->next;
    return p;   
}
//------------------------通讯信息的删除-----------------------------
void Delete(linklist head)
{
    char del;
    listnode *p,*q;
    p=Find(head);
    if(NULL == p)
    {
        printf("没有查到要删除的通讯者!\n");
    }
    q=head;
    while ((q!=NULL) &&(q->next!=p))
    {
        q=q->next;
    }    q->next=p->next;    //删除结点
          free(p);            //释放被删结点空间
          printf("通讯者已被删除!\n");
            
}
//--------------------------遍历输出通讯录---------------------------
void Print(linklist head)
{
    listnode *p;
    p=head->next;
    printf("姓名    号码    地址\n");
    while (p!=NULL)
    {
    printf("%s\t%s\t%s\n",p->data.name,p->data.phone,p->data.adrr);
    printf("---------------------------------------------------------------------------------\n");
    p=p->next;          //后移一个结点
    }
}


图片附件: 游客没有浏览图片的权限,请 登录注册
搜索更多相关主题的帖子: include 通讯录 
2016-06-03 19:54
zhitongze
Rank: 1
等 级:新手上路
帖 子:24
专家分:6
注 册:2016-4-6
收藏
得分:0 
人工顶贴

假如生活给了你一棍子,那么你要小心点,它随时可能会再给你一榔头!
2016-06-03 19:54
zhitongze
Rank: 1
等 级:新手上路
帖 子:24
专家分:6
注 册:2016-4-6
收藏
得分:0 
人工顶贴

假如生活给了你一棍子,那么你要小心点,它随时可能会再给你一榔头!
2016-06-03 19:58
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10552
专家分:42996
注 册:2014-5-20
收藏
得分:14 
    listnode *p,*q;
    ...
    q=p;
看看这里是否有问题?
2016-06-03 21:28
快速回复:编写了一个通讯录程序,创建通讯录后就段错误,求大神指点
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.017089 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved