当前位置:编程学习 > C/C++ >>

求高人指点,C语言的信息管理(链表)遇到了问题、、、、

#include<stdio.h>#include<stdlib.h>#include<string.h>
struct information{char name[16];char 易做图; //w为女性,m为男性int age;struct information* link;};typedef struct information str_information;typedef struct information* pointer;
struct head{int men;int women;pointer link;};
struct head* headlist;
void create_list();void chosefunction();
pointer search();//寻找个人信息位置
void input_information();void input_one();void input_1();void input_2();
void delete_information();void delete_one();void delete_1();void delete_2();

void change_information();void output_information();void count_information();
void finish();
void main(){create_list();chosefunction();}

//创建空链表void create_list(){printf("在进行其他操作之前,必须先创建空链表!\n");printf("创建新链表中--------------------------\n");headlist=(struct head*)malloc(sizeof(struct head));while(headlist==NULL) headlist=(struct head*)malloc(sizeof(struct head));headlist->men=0;headlist->women=0;headlist->link=NULL;printf("创建完成,请选择其他操作!\n\n");}
//功能选择void chosefunction(){int i_choice;printf("\n------功能选择表-----\n");printf("1、输入具体个人信息。\n");printf("2、删除具体个人信息。\n");printf("3、修改具体个人信息。\n");printf("4、输出具体个人信息。\n");printf("5、统计各种信息数据。\n");printf("你的选择:");scanf("%d",&i_choice);switch(i_choice){case 1:input_information();break;case 2:delete_information();break;case 3:change_information();break; case 4:output_information();break;case 5:count_information();break;default:printf("\n输入有误,请重新输入!\n\n"); chosefunction();}}//操作完成,转入主菜单。void finish(){printf("\n----------------操作完成!!----------------\n");chosefunction();}
//第一大功能,输入具体个人信息。void input_information(){int i_choice;printf("---输入具体个人信息--\n");printf("1、输入一个个人信息。\n");printf("2、输入多个个人信息。\n");printf("------3、返回主菜单。\n");printf("你的选择:");scanf("%d",&i_choice); switch(i_choice) { case 1:input_1();break;case 2:input_2();break;case 3:chosefunction();break;default :input_information();}}
//输入个人信息void input_one(){pointer p,q;
if(headlist->link==NULL) { p=(pointer)malloc(sizeof(str_information)); while(p==NULL) p=(pointer)malloc(sizeof(str_information)); p->link=NULL; headlist->link=p;} else{ q=headlist->link; while(q->link!=NULL) q=q->link;
p=(pointer)malloc(sizeof(str_information)); while(p==NULL) p=(pointer)malloc(sizeof(str_information)); p->link=NULL; q->link=p;}
printf("请输入英文名(15个字符以内):");scanf("%s",&p->name);
printf("请输入性别(w为女,m为男):");scanf("%c",&p->易做图);while(1) {if(p->易做图=='w' || p->易做图=='m') break; else { scanf("输入有误,请重新输入!\n"); printf("请输入性别(w为女,m为男):"); scanf("%c",&p->易做图); }}
printf("请输入年龄(范围为0-100):");scanf("%d",&p->age);while(1){if(p->age>0 && p->age<100) break; else { scanf("输入有误,请重新输入!\n"); printf("请输入年龄(范围为0-100):"); scanf("%d",&p->age); }}
if(p->易做图=='w')headlist->women=headlist->women+1;elseheadlist->men=headlist->men+1;}
//输入功能1,输入一个个人信息。void input_1(){input_one();finish();}//输入功能2,输入多个个人信息。void input_2(){int member,counter;printf("请输入你要输入的个人信息数目:");scanf("%d",&member);while(1){ if(member>0) break;else { printf("输入有误,请重新输入!\n"); printf("请输入你要输入的个人信息数目:"); scanf("%d",&member); }}for(counter=0;counter<member;counter++)input_one();finish();}
//第二大功能,删除具体个人信息。void delete_information(){int i_choice;printf("---删除具体个人信息--\n");printf("1、删除一个个人信息。\n");printf("2、删除多个个人信息。\n");printf("------3、返回主菜单。\n");printf("你的选择:");scanf("%d",&i_choice);switch(i_choice){ case 1:delete_1();break; case 2:delete_2();break; case 3:chosefunction();break; default :delete_information();}}
//删除个人信息(关键)void delete_one(){pointer last,del;char search_name[16];printf("请输入英文名进行查找:"); scanf("%s",search_name);
last=search(search_name); if(last==NULL) printf("没有找到任何匹配的个人信息。\n"); else{ del=last->link; last->link=del->link;//这里提示//Loaded 'ntdll.dll', no matching symbolic information found.//Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information //found.//First-chance exception in 链表.exe: 0xC0000005: Access Violation. free(del);}}
//删除功能1,删除一个个人信息void delete_1(){delete_one();finish();chosefunction();}//删除功能2,删除多个个人信息void delete_2(){int member,counter;printf("请输入你要删除的个人信息数目:");scanf("%d",&member);while(1) {if(member>0) break;else { printf("输入有误,请重新输入!\n"); printf("请输入你要删除的个人信息数目:"); scanf("%d",&member); } }for(counter=0;counter<member;counter++)delete_one();finish();chosefunction();}//第三大功能,修改具体个人信息。void change_information(){int i_choice;printf("---修改具体个人信息--\n");printf("1、修改一个个人信息。\n");printf("2、修改多个个人信息。\n");printf("------3、返回主菜单。\n");printf("你的选择:");scanf("%d",&i_choice); switch(i_choice){case 1:break;case 2:break;case 3:chosefunction();break;default :change_information();}}
//第四大功能,输出具体个人信息。(不是关键)void output_information(){int i_choice;printf("---输出具体个人信息--\n");printf("1、输出一个个人信息。\n");printf("2、输出多个个人信息。\n");printf("------3、返回主菜单。\n");printf("你的选择:");scanf("%d",&i_choice);switch(i_choice){case 1:break;case 2:break;case 3:chosefunction();break;default :output_information();}}
//第五大功能,统计各种信息数据。(不是关键)void count_information(){int i_choice;printf("-统计具体个人信息\n");printf("1、统计年龄分布。\n");printf("2、统计性别分布。\n");printf("--3、返回主菜单。\n");printf("你的选择:");scanf("%d",&i_choice);switch(i_choice){case 1:break;case 2:break;case 3:chosefunction();break; default :count_information();}}


//寻找(关键)pointer search(char* search_name){pointer p,q;char compare[16]; strcpy(compare,search_name); if(headlist->link==NULL) return q=NULL;else{
p=headlist->link; q=(pointer)headlist; while(strcmp(p->name,compare)!=0 && p->age!=0 && p->link!=NULL) { q=p; p=p->link; }
if(strcmp(p->name,search_name)!=0 && p->link==NULL) return q=NULL; else return q;//返回所找到结点的前驱}}
谢谢了,就是提示的地方出现了问题,搞了很久也不行,高手指点指点,麻烦了。。提前说声谢谢。。
答案:首先Loaded 'ntdll.dll', no matching symbolic information found.Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.First-chance exception in 链表.exe: 0xC0000005: Access Violation.这几个不是错误,而是你的VC没有正确加载符号表文件。这些DLL是系统加载的,说明你的程序运行需要(或间接需要)这些DLL,由于这些DLL都是发行(Release)版没有调试信息,所以系统提示没有调试符号信息,换用感叹号BuildExecute就好了。
其次你的程序中有个问题。    scanf("%d",&i_choice);这里输入一个不是0-9的字符,程序会陷入死循环。因为scanf()函数是从输入流缓冲区中读取值的,而并非从键盘(也就是终端)缓冲区读取。当它从输入缓冲区中读取下一个字符不是0-9字符的时候,也就是非数字字符,那么一开始scanf %d 就读入不了数据,读入错误,读入错误不会清除缓冲区,然后你的程序会继续调用chosefunction()之类,然后到下一个 scanf %d,读入错误,chosefunction()下一个 scanf %d,读入错误,chosefunction()......
最简单的解决办法,在scanf("%d",&i_choice);之前加rewind(stdin)清除缓冲区,或者用getchar(),分析返回值是否是数字。
  

上一个:要学会cmd系统命令,至少要懂么?C语言。。
下一个:C语言的指针越学越糊涂,有形象生动的方法没?

CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,