| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 511 人关注过本帖
标题:求大神帮我看看我的程序哪里错了。
只看楼主 加入收藏
皖西桃花人
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:44
专家分:118
注 册:2014-10-2
结帖率:100%
收藏
已结贴  问题点数:40 回复次数:6 
求大神帮我看看我的程序哪里错了。
我用单链表建立了一个通讯录管理系统,出错了,求帮忙指点一下。
程序代码:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<malloc.h> 
#define NULL 0
#define LEN sizeof(LNode)
int seat;              //通讯录成员的序号
typedef struct LNode
{//用于通讯录结点
    int number;
    double telenum;
    char  name[20];
    struct LNode *next;
}LNode,*LinkList;       
//1.创建链表
LinkList creatIncreLink()   
{//创建一个存放通讯录成员的非递减有序表,返回头结点地址
    LinkList L=(LinkList)malloc(LEN);             //头结点
    L->next=NULL;
    LinkList p;
    int num=1,number;
    double telenum;
    char name[20];
    printf("请输入学生学号、姓名、电话号码,建立通讯录,以'-1'为输入结束标志\n");
    printf("请输入学号 %d: ",num);
    scanf("%d",&number);
    printf("请输入姓名 %d: ",num);
    char temp=getchar();
    gets(name);
    printf("请输入电话号码 %d: ",num);
    scanf("%lf",&telenum);
    while(number>=0)
    {
        p=(LinkList)malloc(LEN);       //新结点
        p->number=number;
        p->telenum=telenum;
        strcpy(p->name,name);
        inserYouXuLink(L,p);
        num++;
        printf("请输入学号 %d: ",num);
         scanf("%d",&number);
        printf("请输入姓名 %d: ",num);
        temp=getchar();
        gets(name);
        printf("请输入电话号码 %d: ",num);
        scanf("%lf",&telenum);
    }
    return(L);
}
//2.从通讯录中删除第i个元素
void deleteElem(LinkList L,int i)
{
    LinkList p=L;
    int j=0;
    while(p->next && j<i-1)
    {
        p=p->next;
        j++;
    }
    if(!(p->next))         //判断i是否合法,i不能大于元素个数,也不能小于等于0
    {
        printf("第%d个元素删除失败\n",i);
        return ;
    }
    LinkList q=p->next;
    p->next = q->next;
    free(q);
}
//3.按姓名删除通讯录
int delName(LinkList L,char n[])
{
    int flag=0;          //判断要删除的通讯者和通讯录中的姓名是否匹配
    LinkList p=L->next;
    seat=1;
    if(L->next==NULL)
        printf("该链表中没有元素,查找失败\n");
    else
    {
        while(p !=NULL)
        {
            if(!strcmp(P->name,n))   //比较输入的姓名和通讯录中的姓名
            {
                flag=1;
                printf("%S ",p->name);
                p=p->next;
                deleteElem(L,seat);
            }
            else
            {//输入姓名不匹配,指针移到下一个通讯者
                p=p->next;
                seat++;
            }
        }
        if(flag)
            printf("被删除\n");
    }
    return flag;
}
//4.按学号删除通讯者
int delNum(LinkList L,int n)
{
    int flag=0;          //判断要删除的通讯者和通讯录中的学号是否匹配
    LinkList p=L->next;
    seat=1;
    if(L->next==NULL)
        printf("该链表中没有元素,删除失败\n");
    else
    {
        while(p !=NULL)
        {
            if(p->number<=n)
            {
                if(p->number==n)
                {
                    flag=1;         //输入学号匹配
                    printf("%d ",p->number);
                    p=p->next;
                    deleteElem(L,seat);
                }
            }
            else
            {
                p=p->next;
                seat++;
            }
        }
        printf("被删除\n");
    }
    return flag;
}
//5.插入一个元素,使原有序表仍未有序
void insertYouXu(LinkList L,LinkList Elem)
{
    LinkList p=L->next;
    while(p!=NULL && Elem->number=p->number)
    {
        if(p->number==Elem->number)
        {
            printf("重复输入!!\n");
            return;
        }
        p=p->next;
    }            //确定Elem的插入位置
    if(p==NULL)
    {
        p=prior(L,p);
        Elem->next=NULL;
        p->next=Elem;
    }
    else          //若为空表,插到头结点之后
    {
        p=prior(L,p);
        Elem->next=p->next;
        p->next=Elem;
    }
}
//6.打印头结点地址为L的通讯录
void printList(LinkList L)
{
    printf("\n          -------------------\n");
    printf("            学号      姓名     电话号码\n");
    printf("           --------------------\n");
    LinkList p=L;
    int n=1;
    if(L==NULL || L->next==NULL)    //判断通讯录是否为空
        printf("该通讯录中没有元素\n");
    else
        while(p->next !=NULL)
        {
            printf("         %2d   %-9d",n,p->next->number);
            printf("    %-5s  %.0f\n",p->next->name,p->next->telenum);
            p=p->next;
            n++;
        }
    printf("              ------------------\n");
    return;
}
//7.找到位于当前地址元素的前一元素的地址
LinkList prior(LinkList L,LinkList p)
{
    if(L->next==NULL)
        return(L);
    LinkList p_prior=L;
    while(p_prior->next !=p)
        p_prior=p_prior->next;
    return(p_prior);
}
//8.按姓名查找通讯者
int searchName(LinkList L,char n[])
{
    int flag=0;      //标志要查找的通讯者和通讯录中的姓名是否匹配
    LinkList p=L->next;
    seat=1;
    if(L->next==NULL || L==NULL)
        printf("该通讯录中没有元素,查找失败\n");
    else
    {
        while(p !=NULL)
        {
            if(!strcmp(p->name,n))    //比较要查找的姓名是否与当前通讯录所指的姓名匹配
            {
                flag=1;      //输入姓名匹配
                printf("要查找的是第%d个通讯者: \n",seat);
                printf("Number: %d  Name: %s  TeleNo.:%0.f\n",p->number,p->name,p->telenum);
            }
            p=p->next;
            seat++;
        }
    }
    return flag;
}
//9.按学号查找通讯者
int searchName(LinkList L,int n)
{
    int flag=0;      //标志要查找的通讯者和通讯录中的学号是否匹配
    LinkList p=L->next;
    seat=1;
    if(L->next==NULL)
        printf("该链表中没有元素,查找失败\n");
    else
    {
        while(p !=NULL)
        {
            if(p->number<=n)
            if(p->number==n)    
            {
                flag=1;      //输入学号匹配
                printf("要查找的是第%d个通讯者: \n",seat);
                printf("学号: %d  姓名: %s  电话号码.:%0.f\n",p->number,p->name,p->telenum);
            }
            p=p->next;
            seat++;
        }
    }
    return flag;
}
//10.主函数。设定主界面的颜色大小,调用工作区模块函数
void main()
{
    system("color lf");
    printf("\n   **************^@^欢迎使用通讯录系统^@^*************\n");
    printf("          *           1 通讯录的建立                   *\n");
    printf("          *           2 插入通讯记录                   *\n");
    printf("          *           3 查询通讯记录                   *\n");
    printf("          *           4 删除通讯记录                   *\n");
    printf("          *           5 显示通讯录信息                 *\n");
    printf("          *           0 退出管理系统                   *\n");
    printf("     **************^@^欢迎使用通讯录系统^@^*************\n");
    int flag=0;        //通讯录是否建立
    int menu;          //菜单选项
    printf("请选择0 ~ 5: ");
    scanf("%d",&menu);
    while(menu!=0)
    {
        switch(menu)
        {
            case 1:
            {
                L=creatIncreLink();      //调用函数实现通讯录建立
                printf("建立通讯录: ");
                printList(L);
                flag=1;
                break;
            }
            case 2:
            {
                if(flag==1)
                {
                    int number,telenum;
                    char name[20];
                    printf("请输入通讯者的学号和姓名: \n");
                    printf("请输入学号: ");
                    scanf("%d",&number);
                    printf("请输入姓名: ");
                    char temp=getchar();
                    gets(name);
                    printf("请输入电话号码: ");
                    scanf("%d",&telenum);
                    LinkList p=(LinkList)malloc(LEN);       //新结点
                    p->number=number;
                    strcpy(p->name,name);
                    insertYouXu(L,p);
                        printf("插入后: ");
                    printList(L);
                }
                else
                    printf("\nERROR:通讯录还没有建立,请先建立通讯录\n");
                break;
            }
            case 3:
            {
                int way,n,s;
                char na[20];
                if(L!=NULL)
                {
                    if(flag)
                    {
                        printf("选择查找方式: \n");
                        printf("              1.按学号  2.按姓名");
                        scanf("%d",&way);
                        if(way==1)
                        {
                            printf("\n请输入学号:");
                            scanf("%d",&n);
                            s=searchNum(L,n);     //查询通讯录成员
                            if(s==0)
                                printf("无此通讯者,查找失败!\n");
                        }
                        else if(way==2)
                        {
                            printf("\n请输入姓名:");
                            char temp=getchar();
                            gets(na);
                            s=searchName(L,na);
                            if(s==0)
                                printf("无此通讯者,查找失败!\n");
                        }
                        else
                            printf("通讯录中无记录!\n");
                    }
                    break;
                }
                else
                    printf("通讯录中无记录!\n");
                break;
            }
            case 4:
            {
                int way;
                printf("选择删除方式: \n");
                printf("              1.按序号  2.按学号 3.按姓名\n");
                scanf("%d",&way);
                if(way==1)
                {
                    int n;
                    printf("请输入通讯录序号: ");
                    scanf("%d",&n);
                    printf("删除后: \n");
                    deleteElem(L,n);       //按序号删除
                    printList(L);
                }
                else if(way==2)
                {
                    int n,f;
                    printf("\n请输入学号: ");
                    scanf("%d",&n);
                    f=delNum(L,n);         //按学号删除
                    if(f!==0)
                    {
                        printf("删除后: \n");
                        printList(L);
                    }
                    else
                        printf("无该学号,删除失败!\n");
                }
                else if(way==3)
                {
                    char na[20];
                    int f;
                    printf("\n请输入姓名:");
                    char temp=getchar();
                    gets(na);
                    f=delName(L,na);
                    if(f!==0)
                    {
                        printf("删除后: \n");
                        printList(L);
                    }
                    else
                        printf("无此姓名,删除失败!\n");
                }
                else
                    printf("ERROR!!\n");
                break;
            }
            case 5:
            {
                printf("当前通讯录内容如下: \n");        //打印通讯录
                printList(L);
                break;
            }
            case 0: exit(0);
            default: printf("\n没有此功能,请重新输入: \n");
        }
        printf("选择功能: ");
        scanf("%d",&menu);
    }
}
搜索更多相关主题的帖子: 管理系统 通讯录 color 
2014-10-06 23:28
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:0 
逐一排除法

DO IT YOURSELF !
2014-10-07 10:39
app小妖
Rank: 2
等 级:论坛游民
帖 子:2
专家分:25
注 册:2014-10-7
收藏
得分:5 
你的函数没有定义吧!
2014-10-07 10:56
皖西桃花人
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:44
专家分:118
注 册:2014-10-2
收藏
得分:0 
回复 2 楼 wp231957
看到这些错误,我头都大了。
2014-10-07 11:03
wp231957
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:神界
等 级:贵宾
威 望:423
帖 子:13688
专家分:53332
注 册:2012-10-18
收藏
得分:15 
先说说你的代码怎么来的吧

1、纯自己写的
2、抄袭朋友(网络)的
3、老师给的模板 要求你改错

不管哪种,自己都得会调试  不会调试代码 终究是空

DO IT YOURSELF !
2014-10-07 11:08
app小妖
Rank: 2
等 级:论坛游民
帖 子:2
专家分:25
注 册:2014-10-7
收藏
得分:20 
错的问题很多,都是一些细节的问题,比如main()函数里面定义的变量,不能在程序中间定义要在,
void main()
{
   int menu;
   ......
}
要把变量声明在main函数体里最前面,因为编译器编译的时候是从上到下编译的,如果你编译到中间编译器会报错;其他的问题就不清楚啦!
2014-10-07 11:10
皖西桃花人
Rank: 3Rank: 3
等 级:论坛游侠
威 望:2
帖 子:44
专家分:118
注 册:2014-10-2
收藏
得分:0 
回复 5 楼 wp231957
是老师布置的任务,以顺序表、单链表的基本操作为模板,编写通讯录、课程表、班级成绩册等等,自己任选一个。
2014-10-07 12:18
快速回复:求大神帮我看看我的程序哪里错了。
数据加载中...
 
   



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

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