| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1762 人关注过本帖
标题:【求help】我已经纠结了过30个小时了,各位路过的帮忙看一下吧,万分感谢Or ...
只看楼主 加入收藏
moneybright
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-9-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:19 
【求help】我已经纠结了过30个小时了,各位路过的帮忙看一下吧,万分感谢Orz~
各位路过的朋友们帮帮忙吧~我自己实在是无能为力了……

程序一运行到删除那一块的时候就8行了……

还是觉得MAYBE的指针的问题可惜那个我学的太烂了!!~


#include<stdlib.h>
#include<conio.h>
#include<string.h>

#define INITIAL_SIZE 100   /*数组初始大小*/
#define INCR_SIZE 50       /*数组每次增加的大小*/

struct car_info
{
    char name[20];   
    char number[20];  
    char date[20];
    char price[20];
    char company[20];
    char sort[20];
    struct car_info *next;
};

typedef struct car_info CarInfo;

extern int numCars;        /*记录的车辆数*/
extern CarInfo*records;    /*记录车辆信息的数组*/
extern char savedTag;      /*信息时候已保存的标志,0为以保存,1为未保存*/
extern int arraySize;      /*数组大小*/

void handle_menu(void);
int select_menu(void);
void add(void);
void modify(void);
void display(void);
void query(void);
void delMenu(void);
CarInfo *onedel(CarInfo *records);
void alldel(CarInfo *records);
int sdelMenu(void);
int save(void);
int load(void);

void quit(void);
void showTable(void);
int find(char*target,int targetType,int from);
void copy(CarInfo*src,CarInfo*dest);

#endif   

/*初始化*/


int numCars=0;
CarInfo *records=NULL;
char savedTag=0;                   /*记录是否保存的标志,0为已保存,1为未保存*/
int arraySize;
char*sort[]={"豪华型","紧凑型","微型","中型"};


/*主函数*/


 int main()
 {
   
    /*初始化数组*/
    records=(CarInfo*)malloc(sizeof(CarInfo)*INITIAL_SIZE);
    if(records==NULL)
    {
        printf("memory fail!");
        exit(-1);

    }
    arraySize=INITIAL_SIZE;
   
   
   
    /*主界面*/

    printf("\n******************************CAR SALES SYSTEM**********************************\n");



     
    handle_menu();

 }
 
 
 /*菜单处理函数*/
 
 void handle_menu(void)
 {
     for(; ;)
     {
         switch(select_menu())
         {
         case 1:
             add();     
             break;
         case 2:
             modify();
             break;
         case 3:
             display();
             break;
         case 4:
             query();  
             break;
         case 5:
             delMenu();
             break;
         case 6:
             save();
             break;
         case 7:
             load();
             break;
         case 8:
             quit();         
         }
     }
 }

 
 /*菜单选择函数*/

 int select_menu()
{
    char s[2];
    int cn=0;
    printf("\n");
    printf("\t1.增加信息\n");
    printf("\t2.修改信息\n");
    printf("\t3.显示信息\n");
    printf("\t4.查询信息\n");
    printf("\t5.删除信息\n");
    printf("\t6.保存信息至记录文件\n");
    printf("\t7.从记录文件中读取信息\n");
    printf("\t8.结束运行\n");
    printf("\n\t左边数字对应功能选择,请选择1-8:");

    for(;;)
    {
        gets(s);
        cn=atoi(s);
        if(cn<1||cn>8)
            printf("\n\t输入错误,请重新选择1-8:");
        else
            break;
    }
    return  cn;
}


 /*结束运行,退出*/

 void quit(void)
 {
     char str[5];
     if(savedTag==1)          /*记录尚未保存*/
     {
         printf("是否保存原来的记录?(Y/n)");
         gets(str);
         if(str[0]!='n'&&str[0]!='N')
             save();          /*调用保存函数保存记录*/
     }
     free(records);
     exit(0);
 }
/*
  文件存储操作函数
  结果:数组records被保存到指定文件
  返回:成功0,失败-1
*/
int save()
{
    FILE*fp;
    char fname[30];
   
    if(numCars==0)
    {
        printf("没有记录可存!");
        return -1;
    }

    printf("请输入要存入的文件名(直接回车选择文件car_info):");
    gets(fname);
    if(strlen(fname)==0)
        strcpy(fname,"car_info");

    if((fp=fopen(fname,"wb"))==NULL)
    {
        printf("不能存入文件!\n");
        return -1;
    }

    printf("\n存文件...\n");
    fwrite(records,sizeof(CarInfo)*numCars,1,fp);
    fclose(fp);
    printf("%d条记录已经存入文件,请继续操作。\n",numCars);
    savedTag=0;
    return 0;
}

/*
  文件读取操作函数
  结果:records为从指定文件中读取出的记录
  返回:成功0,失败-1
*/

int load(void)
{
    FILE*fp;
    char fname[30];
    char str[5];

    if(numCars!=0 && savedTag==0)
    {
        printf("选择覆盖现有记录(Y),还是像读取的记录添加到现有记录之后(n)?\n");
        printf("直接回车则覆盖现有记录\n");
        gets(str);

        if(str[0]=='n'||str[0]=='N')
            savedTag=1;                     /*将读取的记录添加到现有记录之后*/
        else
        {
            if(savedTag==1)                 /*覆盖现有记录*/
            {
                printf("读取文件将会更改原有的记录,是否保存原有记录?(Y/n)");
                gets(str);
                if(str[0]!='Y' && str[0]!='n')
                    save();
            }
            numCars=0;
        }
    }

    printf("请输入要读取的文件名(直接回车选择文件car_info):");
    gets(fname);
    if(strlen(fname)==0)
        strcpy(fname,"car_info");

    if((fp=fopen(fname,"rb"))==NULL)
    {
        printf("打不开文件!请重新选择\n");
        return -1;
    }
    printf("\n取文件...\n");
    while(!feof(fp))
    {
        /*现在的数组空间不足,需要重新申请空间*/
        if(numCars>=arraySize)
        {
            
            records=(CarInfo*)realloc(records,(arraySize+INCR_SIZE)*sizeof(CarInfo));
            if(records==NULL)
            {
                printf("menmory fail!");
                exit(-1);
            }
            arraySize=arraySize+INCR_SIZE;
        }
        if(fread(&records[numCars],sizeof(CarInfo),1,fp)!=1)
            break;
        numCars++;
    }
    fclose(fp);
    printf("\n现在有%d条记录。",numCars);
    return 0;
}
/*输出表头*/

void showTable(void)
{
    printf("\n---------------------------INFORMATION------------------------------------------\n");
    printf("name\tnumber\tdate\tprice\tcompany\tsort");
    printf("\n--------------------------------------------------------------------------------\n");
}


/*显示所有汽车的信息*/


void display(void)
{
    int i;
    if(numCars==0)
    {
        printf("没有可显示的记录!");
        return;
    }
    showTable();   /*打印表头*/
    for(i=0;i<numCars;i++)
    {
        /*打印汽车信息*/
        printf("%s\t%s\t%s\t%s\t%s\t%s\n",records[i].name,records[i].number,records[i].date,
                records[i].price,records[i].company,records[i].sort);
        
        /*打印满20个记录后停下来*/

        if(i%19==0&&i!=0)
        {
            printf("输入任一字符后继续...\n");
            getch();
            printf("\n\n");
            showTable();
        }
    }
}

/*
  当前表的末尾增加新的信息
  结果:records中将记录新的信息
  注意:若数组的大小不够,会重新申请新的数组空间
*/

void add(void)
{
    char str[10];


    if(numCars==0)
        printf("原来没有记录,现在建立新表\n");
    else
        printf("下面在当前表的末尾增加新的信息\n");
    while(1)
    {
        printf("您将要添加一组信息,确定么?(Y/n)");
        gets(str);
        if(str[0]=='n'||str[0]=='N')  /*不再添加新的信息*/
            break;
        if(numCars>=arraySize)        /*现在的数组空间不足,需要申请新空间*/
        {
            records=(CarInfo*)realloc(records,(arraySize+INCR_SIZE)*sizeof(CarInfo));
            if(records==NULL)
            {
                printf("memory fail!");
                exit(-1);
            }
            arraySize=arraySize+INCR_SIZE;
        }

        printf("请输入名称");
        gets(records[numCars].name);
        
        printf("请输入代号");
        gets(records[numCars].number);
        
        printf("请输入上市时间");
        gets(records[numCars].date);
        
        printf("请输入价格");
        gets(records[numCars].price);

        printf("请输入公司");
        gets(records[numCars].company);

        printf("请输入类型");
        gets(records[numCars].sort);

        numCars++;
    }
    printf("\n现在一共有%d条信息\n",numCars);
    savedTag=1;
}
/*
  注意:如果在添加新信息之前,numCars已经大于或等于arraySize,
  则使用realloc函数重新为records分配一块大小为(arraySize+INCRSIZE)个CarInfo的数组的存储块
  并重新设置arraySize
*/
/*
  查找指定记录
  参数   target:欲查找的某一项与target相同
         targetType:表明通过哪一类别来查找:
         0为车辆名称,1为车辆代号,2为公司名称,3为车型(微型,紧凑型,中型,豪华型)
  返回   正常返回找的记录序号
         没有找到返回 -1
*/


int find(char*target,int targetType, int from)
{
    int i;
    for(i=from; i<numCars; i++)
    {
        if((targetType==0 && strcmp(target,records[i].name)==0)||
           (targetType==1 && strcmp(target,records[i].number)==0)||
           (targetType==2 && strcmp(target,records[i].company)==0)||
           (targetType==3 && strcmp(target,records[i].sort)==0))
           return i;
    }
    return -1;
}

/*
  查找指定车辆信息
  可以按照车辆名称,车辆代号,公司名称,车型来查找*/

void query(void)
{
    char str[5];
    char target[20];
    int type;
    int count;
    int i;
    if(numCars==0)
    {   
        printf("没有可供查询的记录");
        return;
    }
    while(1)
    {
        printf("请输入查询方式(按回车则结束本次查询):\n");
        printf("1.按名称\n");
        printf("2.按代号\n");
        printf("3.按公司\n");
        printf("4.按车型\n");
        gets(str);
        if(strlen(str)==0)
            break;
        if(str[0]==1)
        {
            printf("请输入名称");
            gets(target);
            type=0;
        }
        else
        if(str[0]==2)
        {
            printf("请车辆代号");
            gets(target);
            type=1;
        }
        else
        if(str[0]==3)
        {
            printf("请输入公司");
            gets(target);
            type=2;
        }
        else
        {
            printf("请输入车型");
            gets(target);
            type=3;
        }

        i=find(target,type,0);
        if(i==1)
        {
            showTable();   /*打印查询到的车辆信息*/
        }
        count=0;
        while(i!=-1)
        {
            count++;
            printf("%s\t%s\t%s\t%s\t%s\t%s",records[i].name,records[i].number,records[i].date,
                    records[i].price,records[i].company,records[i].sort);
            i=find(target,type,i+1);
        }
        if(count==0)
            printf("没有找到符合条件的车辆!\n");
        else
            printf("\n一共找到%d辆符合条件的车辆\n",count);
    }
}


/*删除记录函数*/

void delMenu(void)
 {
     switch(sdelMenu())
     {
     case 1:
         records=onedel(records);            //部分删除     
         break;           
     case 2:
         alldel(records);                //全部删除
         break;
     case 0:
         return;                        //返回主界面
     }
 }

 
 /*菜单选择函数*/

 int sdelMenu()
{
    int ch;
    printf("\n");
    printf("\t1.删除指定条车辆信息\n");

    printf("\t2.删除全部车辆信息\n");
    printf("\t0.返回主界面\n");
    printf("\n\t左边数字对应功能选择,请选择:");

    for(;;)
    {
        scanf("%d",&ch);
        if(ch<0||ch>2)
            printf("\n\t输入错误,请重新选择:");
        else
            break;
    }
    return  ch;
}




//逐条删除
CarInfo *onedel(CarInfo *records)
{
    CarInfo *p,*q;                                    //*p为查找到要删除的接点,q为其前驱指针
    char onename[20];                            //存放要删除的名称   
    char c;                                        //确认指令删除or not

    printf("请输入你要删除的车辆名称\nPlease input the name of the car you want to delete\n");
                                                //输出提示信息
    scanf("%s",onename);                        //输入要删除的车辆名称
    q=p=records;                                        //给p、q赋初值头指针
    while (strcmp(p->name,onename)&&p!=NULL)    //当记录得名称非要找的,或者指针为空时
    {
        q=p;
        p=p->next;                                //p指向下一项记录
    }
    if(p==NULL)                                    //p是否为空
    {
        printf("\n 列表中不存在名字为%s的车",onename);
        printf("\n List no %s car\n",onename);    //输出无该结点
        //【返回主界面】
    }
    else
    {
        printf("**************************have found*****************************");
        printf("|  名称  |  代号  | 上市日期 | 车型 | 价格 | 所属公司 |\n");
        printf("|--------|--------|----------|------|------|----------|\n");
        printf("|%s|%s|%4d %2d %2d|%1d|%d|%s|\n",p->name,p->number,p->date,p->sort,p->price,p->company);
        printf("******************************************************************");
        printf("\n确定要删除吗?Y OR N!\n");    //显示删除信息                                                   
        scanf("%s",&c);
        if((c=='y')||(c=='Y'))
        {
            if(p==records)
                records=p->next;
            else
                q->next=p->next;
            free(p);
            printf("delete………………\n");
            printf("\n**********该车已经删除********");
            return(records);
        }
        
    }
}


//全部删除
void alldel(CarInfo *records)
{
    CarInfo *p,*q;
    char c;                                        //确认指令删除or not
    printf("\n确定全部要删除吗?Y OR N!\n");
    scanf("%s",&c);
    if((c=='y')||(c=='Y'))
    {
        p=records->next;
        q=records;
        while(p!=NULL)
        {
            free(q);
            q=p;
            p=p->next;        
        }
        free(q);
        printf("All record are delete.\n\n");
    }
    else
        return;
}
/*修改指定车辆信息函数*/

void modify(void)
{
    char str[5];
    char target[20];
    int type;
    int i;

    if(numCars==0)
    {
        printf("没有可供修改的记录");
        return;
    }

    while(1)
    {
        printf("请输入如何找到欲修改的记录的方式:");
        printf("(直接回车则结束修改操作)\n");
        printf("1.按名称\n");
        printf("2.按代号\n");
        printf("3.按名称\n");
        printf("4.按车型\n");
        
        gets(str);

        if(strlen(str)==0)
            break;
        
        if(str[0]=='1')
        {
            printf("请输入名称");
            gets(target);
            type=0;
        }
        else
        if(str[0]=='2')
        {
            printf("请输入代号");
            gets(target);
            type=1;
        }
        else
        if(str[0]=='3')
        {
            printf("请输入公司");
            gets(target);
            type=2;
        }
        else
        {
            printf("请输入车型");
            gets(target);
            type=3;
        }

        i=find(target,type,0);
        if(i==-1)
            printf("没有符合条件的车辆!\n");

        while(i!=-1)
        {
            showTable();
            printf("%s\t%s\t%s\t%s\t%s\t%s",records[i].name,records[i].number,records[i].date,
                    records[i].price,records[i].company,records[i].sort);

            printf("确定要修改该车辆的信息吗?(Y/n)");
            gets(str);

            if(str[0]=='y'||str[0]=='Y')
            {
                printf("下面请重新输入该车辆的信息:\n");
                printf("请输入名称:\n");
                gets(records[i].name);
            
                printf("请输入代号:\n");
                gets(records[i].number);

                printf("请日期:\n");
                gets(records[i].date);

                printf("请价格:\n");
                gets(records[i].price);

                printf("请输入公司:\n");
                gets(records[i].company);

                printf("请输入车型:\n");
                gets(records[i].sort);
            }
            i=find(target,type,i+1);
        }
    }
    savedTag=1;
}



        



[ 本帖最后由 moneybright 于 2010-9-7 16:28 编辑 ]
搜索更多相关主题的帖子: 感谢 纠结 help Orz 
2010-09-07 11:29
hy1107648
Rank: 2
等 级:论坛游民
帖 子:80
专家分:40
注 册:2010-2-8
收藏
得分:0 
汗。。 楼主你刚学就写了这么长的程序?? 膜拜!Orz
2010-09-07 11:36
moneybright
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-9-7
收藏
得分:0 
回复 2楼 hy1107648
哭……这是我们的作业啊作业……照着书自己摸索的……然后出错就完全不会了~……
2010-09-07 11:38
az9841682
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:5
帖 子:312
专家分:596
注 册:2009-9-11
收藏
得分:0 
膜拜楼主 烧香中
那么长的代码 不是偶等知识可以解决了
打死我都解决不了那么长的代码
2010-09-07 14:34
xu362726904
Rank: 6Rank: 6
等 级:侠之大者
帖 子:160
专家分:471
注 册:2009-6-18
收藏
得分:0 
把运行结果发上来
2010-09-07 17:53
jack10141
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:陕西西安
等 级:小飞侠
威 望:6
帖 子:706
专家分:2271
注 册:2010-8-10
收藏
得分:0 
回复 楼主 moneybright
楼主应该考虑分段编译,然后联调,尽量把错误的范围缩小,这样比较容易解决!

Coding就像一盒巧克力,你永远不会知道你会遇到什么BUG
别跟我说你是不能的,这让我愤怒,因为这侮辱了你的智慧
2010-09-07 18:07
moneybright
Rank: 1
等 级:新手上路
帖 子:7
专家分:0
注 册:2010-9-7
收藏
得分:0 
回复 5楼 xu362726904
就在全部删除那块

图片附件: 游客没有浏览图片的权限,请 登录注册


其他都挺正常的,就是这样……
2010-09-07 18:16
hahayezhe
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖南张家界
等 级:贵宾
威 望:24
帖 子:1386
专家分:6999
注 册:2010-3-8
收藏
得分:15 
首先删除的时候你可以修改下
    p=records;  
while (p!=NULL)    //当记录得名称非要找的,或者指针为空时
    {
        if(strcmp(p->name,onename)==0){
          q=p;
          break;
        }
        p=p->next;                                //p指向下一项记录
    }最好是判断 然后用 q保存要删除的点的前驱

if((c=='y')||(c=='Y'))
        {
            if(p==records)
                records=p->next;
            else
                q->next=p->next;
            free(p);
            printf("delete………………\n");
            printf("\n**********该车已经删除********");
            return(records);
        }
删除你要判断其尾部

最后下断点调式删除错误,发现records没有NULL尾
也就是说 当不给其赋值任何的时候操作你的records链表是个错的

然后调式中发现 理应records是NULL 但是越还能够进入循环
但是里面name居然是空的,
用空的name传入strcmp肯定错了

将while (p!=NULL)    //当记录得名称非要找的,或者指针为空时
    {
        //if(strcmp(p->name,onename)==0)注释起来
        {
          q=p;
          break;
        }
        p=p->next;                                //p指向下一项记录
    }
然后正常跳过 提示删除出现乱码
错误在初始化中!
2010-09-07 18:44
sunyh1999
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:14
帖 子:1178
专家分:3032
注 册:2009-5-17
收藏
得分:0 
等有空了再看看,确实比较长,你把你认为可能错的发上来看看,这样让我们一行行找,确实有点难度

欢迎来到我的博客:http://blog..cn/noisunyuhong
2010-09-07 19:18
燕强
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:78
专家分:188
注 册:2010-8-11
收藏
得分:5 
//逐条删除
CarInfo *onedel(CarInfo *records)
在这个函数中,有个错误。那就是
输出函数输出变量数目不匹配

printf("**************************have found*****************************");
        printf("|  名称  |  代号  | 上市日期 | 车型 | 价格 | 所属公司 |\n");
        printf("|--------|--------|----------|------|------|----------|\n");
        printf("|%s|%s|%4d %2d %2d|%1d|%d|%s|\n",p->name,p->number,p->date,p->sort,p->price,p->company);//就是这里。你改改看看能运行吗?
2010-09-07 20:40
快速回复:【求help】我已经纠结了过30个小时了,各位路过的帮忙看一下吧,万分感 ...
数据加载中...
 
   



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

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