|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct Telbook
- {
- char name[12];
- char number[15];
- char beizhu[24];
- struct Telbook *next;
- } PLR,*PLRPIN;
- void PrintInfo(PLRPIN Info);
- void InsertInfo(PLRPIN *Info); //把地址给它,用*把系统分给头指针的地址里的值拿出来做修改,就可以指向其它的值,所以要两层引用
- void InputInfo(PLRPIN);
- void releaseInfo(PLRPIN *Info);//释放所有内存空间,不是一个结构哟
- void searchInfo(PLRPIN Info);
- void DelInfo(PLRPIN *Info);
- void ModfiyInfo(PLRPIN *INFO);
- #define ME_ALLCARD 1
- #define ME_FOUNDCARD 2
- #define ME_DELCARD 3
- #define ME_MODIFYCARD 4
- #define ME_NEWCARD 5
- #define ME_EXIT 0
- #define _CRT_SECURE_NO_WARNINGS //排错
- int main()
- {
- int iMenu;
- char cExit,cInput;
- PLRPIN Headr=NULL; //声明一个头指针,并给值等0;
-
- do
- {
- printf("\n|-------------------------------|菜单|-----------------------------------|\n\n");
- printf("| 1.显示所有名片|2.查找名片|3.删除名片|4.修改名片|5.新建名片|0.退出 |\n\n");
- printf("|--------------------------------------------------------------------------|\n");
- printf("\n请输入数字选择菜单:");
- reInput:
- scanf("%d",&iMenu); //条件选择菜单
- switch(iMenu)
- {
- case ME_ALLCARD:
- PrintInfo(Headr);
- break;
- case ME_FOUNDCARD:
-
- searchInfo(Headr);
- break;
- case ME_DELCARD:
- DelInfo(&Headr);
- break;
- case ME_NEWCARD:
- while(1)
- {
- printf("请问是否要新建名片(Y/N):");
- do
- {
- cInput=getchar();
- }while(cInput !='Y' && cInput != 'N');
- if(cInput == 'Y')
- {
- InsertInfo(&Headr);
- }
- else
- {
- break;
- }
- }
-
- break;
- case ME_MODIFYCARD:
- ModfiyInfo(&Headr);
- break;
- case ME_EXIT:
- printf("感谢您的使用,程序准备退出!\n确认退出请输入(Y/N):");
- do
- {
- cExit=getchar();
- }while(cExit != 'Y' && cExit != 'N');
- if(cExit == 'Y')
- {
- releaseInfo(&Headr);
- exit(1);
- }
- break;
- default :
- printf("输入的选项无效,请重新输入(1~5):");
- goto reInput;
- break;
- }
- }while(1);
- //releaseInfo(&Headr);
- return 0;
- }
- void DelInfo(PLRPIN *Info) //删除信息
- {
- char cName[24];
- char cYesNo;
- PLRPIN Current,Previous;
- printf("请输入要删除的名片姓名:");
- scanf("%s",cName);
- printf("确定要删除 %s 吗?(Y/N):",cName);
- do
- {
-
- cYesNo = getchar();
- }while (cYesNo != 'Y' && cYesNo != 'N');
-
- if(cYesNo == 'Y')
- {
- Current = *Info;
- Previous = NULL;
- while(Current != NULL && Current->name == cName) //搜查符合的条件
- {
- Previous =Current;
- Current=Current->next;
- }
- if(Current == NULL)
- {
- printf("没有找到要删除的名片,请确认您的输入!\n");
- return ;
- }
- else
- {
- if(Previous == NULL)
- {
- *Info=Current->next;
- }
- else
- {
- Previous->next=Current->next;
- }
- printf("删除成功!\n");
- free(Current);
- }
- }
- }
- void InsertInfo(PLRPIN *Info) //传入指向指针结构的指针来修改指针/拿到头指指针就能操作单链表,所有主函数里的是头指针,传递给其它函数便于操作。
- {
- PLRPIN Temp,New;
- static PLRPIN Nup; //尾插法的重点,必须是静态变量,才能一直指向NULL
- New=(PLRPIN)malloc(sizeof(PLR));
- if(NULL == New)
- {
- printf("新的空间分配失败\n");
- return ;
- }
- InputInfo(New);
- //--------------------尾插法---------------------------------
- if(*Info != NULL)
- {
- Nup->next = New;
- New->next=NULL;
- /*------------遍历效率代------------------
- while (Temp->next != NULL)
- {
- //Temp = Temp->next; //搜查NULL
- }
- //找到NULL插入数据
- Temp->next= New;
- New->next = NULL;
- ---------------------------*/
- }
- else
- {
- *Info = New;
- New->next = NULL;
- }
- Nup=New;
- /**************************头插法*********************************
- if(*Info != NULL)
- {
- Temp=*Info; //把头指针放入TEMP 再把新的转接赋值达到插入的目的。
- *Info=New;
- New->next=Temp;
- }
- else
- {
- *Info=New;
- New->next=NULL;
- }
- *******************************************************************/
- }
- void InputInfo(PLRPIN Info) //输入信息
- {
- PLRPIN New;
- New=Info;
- printf("请输入姓名:");
- scanf("%s",New->name);
- printf("请给人物职业:");
- scanf("%s",New->beizhu);
- printf("请输入号码:");
- scanf("%s",New->number);
- }
- void PrintInfo(PLRPIN Info) //打印输出
- {
-
- PLRPIN New;
- int count =1;
- New=Info;
- printf("\n\n|------------------------------|通迅录|----------------------------------|\n\n");
- printf("|编号|\t|姓名|\t|职业|\t|联系方式|\n");
- while(New != NULL )
- {
- printf("%5d%17s%18s%21s\n",count,New->name,New->beizhu,New->number);
- New=New->next;
- count++;
- }
- putchar('\n');
- }
- void releaseInfo(PLRPIN *Info) //释放空间
- {
- PLRPIN Temp;
- while (*Info != NULL)
- {
- Temp=*Info;
- *Info=(*Info)->next;
- free(Temp);
- }
- }
- void searchInfo(PLRPIN Info) //查找信息
- {
- char target[128];
- PLRPIN New;
- printf("请输入要找查名片的信息[姓名,职业,电话号码] :");
- scanf("%s",target);
- New=Info;
- while(New != NULL)
- {
- if(!strcmp(New->name,target) || !strcmp(New->beizhu,target) || !strcmp(New->number,target))
- {
- break;
- }
- New = New->next;
- }
- if(New == NULL)
- {
- printf("很抱赚,没有找到您要的结果!\n");
- }
- else
- {
- do
- {
- printf("已找到符合条件的名片...\n");
- PrintInfo(New);
- }while(New->next != NULL);
- }
- releaseInfo(&New);
-
- }
- void ModfiyInfo(PLRPIN *Info) //修改信息
- {
- char cName[24];
- char cYesNo;
- PLRPIN Current;
- printf("请输入要修改名片的姓名:");
- scanf("%s",cName);
- printf("确定要修改 %s 信息吗?(Y/N):",cName);
- do
- {
- cYesNo = getchar();
- }while (cYesNo != 'Y' && cYesNo != 'N');
-
- if(cYesNo == 'Y')
- {
- Current = *Info;
-
- while(Current != NULL && Current->name == cName) //搜查符合的条件
- {
- Current=Current->next;
- }
- if(Current == NULL)
- {
- printf("没有找到要修改的名片,请确认您的输入!\n");
- return ;
- }
- else
- {
- printf("找到匹配:%s %s %s\n",Current->name,Current->beizhu,Current->number );
- printf("将%s修改为:",Current->name);
- scanf("%s",Current->name);
- printf("将%s修改为:",Current->beizhu);
- scanf("%s",Current->beizhu);
- printf("将%s修改为:",Current->number);
- scanf("%s",Current->number);
- printf("修改后的信息为:%s %s %s\n",Current->name,Current->beizhu,Current->number );
- printf("修改成功!\n");
- }
- }
- }
复制代码
第二次调用查找函数就出错,但不知道是什么原因。
帮你修改了。
主要是DelInfo()和searcheInfo();详细看注释。
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct Telbook
- {
- char name[12];
- char number[15];
- char beizhu[24];
- struct Telbook *next;
- } PLR, *PLRPIN;
- void PrintInfo(PLRPIN Info);
- void InsertInfo(PLRPIN *Info); //把地址给它,用*把系统分给头指针的地址里的值拿出来做修改,就可以指向其它的值,所以要两层引用
- void InputInfo(PLRPIN);
- void releaseInfo(PLRPIN *Info); //释放所有内存空间,不是一个结构哟
- void searchInfo(PLRPIN Info);
- void DelInfo(PLRPIN *Info);
- void ModfiyInfo(PLRPIN *INFO);
- #define ME_ALLCARD 1
- #define ME_FOUNDCARD 2
- #define ME_DELCARD 3
- #define ME_MODIFYCARD 4
- #define ME_NEWCARD 5
- #define ME_EXIT 0
- #define _CRT_SECURE_NO_WARNINGS //排错
- int main()
- {
- int iMenu;
- char cExit, cInput;
- PLRPIN Headr = NULL; //声明一个头指针,并给值等0;
- do
- {
- printf("\n|-------------------------------|菜单|-----------------------------------|\n\n");
- printf("| 1.显示所有名片|2.查找名片|3.删除名片|4.修改名片|5.新建名片|0.退出 |\n\n");
- printf("|--------------------------------------------------------------------------|\n");
- printf("\n请输入数字选择菜单:");
- reInput:
- scanf("%d", &iMenu); //条件选择菜单
- switch (iMenu)
- {
- case ME_ALLCARD:
- PrintInfo(Headr);
- break;
- case ME_FOUNDCARD:
- searchInfo(Headr);
- break;
- case ME_DELCARD:
- DelInfo(&Headr);
- break;
- case ME_NEWCARD:
- while (1)
- {
- printf("请问是否要新建名片(Y/N):");
- do
- {
- cInput = getchar();
- } while (cInput != 'Y' && cInput != 'N');
- if (cInput == 'Y')
- {
- InsertInfo(&Headr);
- }
- else
- {
- break;
- }
- }
- break;
- case ME_MODIFYCARD:
- ModfiyInfo(&Headr);
- break;
- case ME_EXIT:
- printf("感谢您的使用,程序准备退出!\n确认退出请输入(Y/N):");
- do
- {
- cExit = getchar();
- } while (cExit != 'Y' && cExit != 'N');
- if (cExit == 'Y')
- {
- releaseInfo(&Headr);
- exit(1);
- }
- break;
- default:
- printf("输入的选项无效,请重新输入(1~5):");
- goto reInput;
- break;
- }
- } while (1);
- //releaseInfo(&Headr);
- return 0;
- }
- void DelInfo(PLRPIN *Info) //删除信息
- {
- char cName[24];
- char cYesNo;
- PLRPIN Current, Previous;
- printf("请输入要删除的名片姓名:");
- scanf("%s", cName);
- printf("确定要删除 %s 吗?(Y/N):", cName);
- do
- {
- cYesNo = getchar();
- } while (cYesNo != 'Y' && cYesNo != 'N');
- if (cYesNo == 'Y')
- {
- Current = *Info;
- Previous = NULL;
- //while (Current != NULL && Current->name == cName) //这里逻辑错误;应该是Current->name!=name
- while (Current != NULL && strcmp(Current->name, cName))
- {
- Previous = Current;
- Current = Current->next;
- }
- if (Current == NULL)
- {
- printf("没有找到要删除的名片,请确认您的输入!\n");
- return;
- }
- else
- {
- if (Previous == NULL)
- {
- *Info = Current->next;
- }
- else
- {
- Previous->next = Current->next;
- }
- printf("删除成功!\n");
- free(Current);
- }
- }
- }
- void InsertInfo(PLRPIN *Info) //传入指向指针结构的指针来修改指针/拿到头指指针就能操作单链表,所有主函数里的是头指针,传递给其它函数便于操作。
- {
- PLRPIN Temp, New;
- static PLRPIN Nup; //尾插法的重点,必须是静态变量,才能一直指向NULL
- New = (PLRPIN)malloc(sizeof(PLR));
- if (NULL == New)
- {
- printf("新的空间分配失败\n");
- return;
- }
- InputInfo(New);
- //--------------------尾插法---------------------------------
- if (*Info != NULL)
- {
- Nup->next = New;
- New->next = NULL;
- /*------------遍历效率代------------------
- while (Temp->next != NULL)
- {
- //Temp = Temp->next; //搜查NULL
- }
- //找到NULL插入数据
- Temp->next= New;
- New->next = NULL;
- ---------------------------*/
- }
- else
- {
- *Info = New;
- New->next = NULL;
- }
- Nup = New;
- /**************************头插法*********************************
- if(*Info != NULL)
- {
- Temp=*Info; //把头指针放入TEMP 再把新的转接赋值达到插入的目的。
- *Info=New;
- New->next=Temp;
- }
- else
- {
- *Info=New;
- New->next=NULL;
- }
- *******************************************************************/
- }
- void InputInfo(PLRPIN Info) //输入信息
- {
- PLRPIN New;
- New = Info;
- printf("请输入姓名:");
- scanf("%s", New->name);
- printf("请给人物职业:");
- scanf("%s", New->beizhu);
- printf("请输入号码:");
- scanf("%s", New->number);
- }
- void PrintInfo(PLRPIN Info) //打印输出
- {
- PLRPIN New;
- int count = 1;
- New = Info;
- printf("\n\n|------------------------------|通迅录|----------------------------------|\n\n");
- printf("|编号|\t|姓名|\t|职业|\t|联系方式|\n");
- while (New != NULL)
- {
- printf("%5d%17s%18s%21s\n", count, New->name, New->beizhu, New->number);
- New = New->next;
- count++;
- }
- putchar('\n');
- }
- void releaseInfo(PLRPIN *Info) //释放空间
- {
- PLRPIN Temp;
- while (*Info != NULL)
- {
- Temp = *Info;
- *Info = (*Info)->next;
- free(Temp);
- }
- }
- void searchInfo(PLRPIN Info) //查找信息
- {
- char target[128];
- PLRPIN New;
- printf("请输入要找查名片的信息[姓名,职业,电话号码] :");
- scanf("%s", target);
- New = Info;
- PLRPIN founded=NULL;
-
- // while (New != NULL)
- // {
- // if (!strcmp(New->name, target) || !strcmp(New->beizhu, target) || !strcmp(New->number, target))
- // {
- // break;
- // }
- // New = New->next;
- // } //这一块有问题,只找到第一个符号条件的名片。
- while (New != NULL) // 查找目标名片,把所有找到的名片用新链表founded指示
- {
- if (!strcmp(New->name, target) || !strcmp(New->beizhu, target) || !strcmp(New->number, target))
- {
- PLRPIN node= (PLRPIN)malloc(sizeof(PLR)); // 新建结点存储搜索到的结点
- *node = *New; //将找到的名片内容copy到新链表中
- node->next = NULL; //next 复位,防止影响原链表内容
- if (founded == NULL)
- {
- founded = node;
- }
- else
- {
- founded->next = node;
- }
- }
- New = New->next;
- }
- if (founded == NULL)
- {
- printf("很抱赚,没有找到您要的结果!\n");
- }
- else
- {
- printf("已找到符合条件的名片...\n");
- PrintInfo(founded); // 打印搜索处理的名片
- // do
- // {
- // printf("已找到符合条件的名片...\n");
- // //PrintInfo(New);//这个函数是从New所指的结点打印之后的所有名片啊!这样调用有问题吧;
- // } while (New->next != NULL);
- }
- releaseInfo(&founded); // 打印完成后释放掉新建的链表
- //releaseInfo(&New); //不能调用releaseInfo; New所指向的名片结点和Info中的某些结点是共用的。
- //调用之后,会把Info中与指针New地址相同的结点之后的所有结点的内存空间释放掉
- }
- void ModfiyInfo(PLRPIN *Info) //修改信息
- {
- char cName[24];
- char cYesNo;
- PLRPIN Current;
- printf("请输入要修改名片的姓名:");
- scanf("%s", cName);
- printf("确定要修改 %s 信息吗?(Y/N):", cName);
- do
- {
- cYesNo = getchar();
- } while (cYesNo != 'Y' && cYesNo != 'N');
- if (cYesNo == 'Y')
- {
- Current = *Info;
- while (Current != NULL && Current->name == cName) //搜查符合的条件
- {
- Current = Current->next;
- }
- if (Current == NULL)
- {
- printf("没有找到要修改的名片,请确认您的输入!\n");
- return;
- }
- else
- {
- printf("找到匹配:%s %s %s\n", Current->name, Current->beizhu, Current->number);
- printf("将%s修改为:", Current->name);
- scanf("%s", Current->name);
- printf("将%s修改为:", Current->beizhu);
- scanf("%s", Current->beizhu);
- printf("将%s修改为:", Current->number);
- scanf("%s", Current->number);
- printf("修改后的信息为:%s %s %s\n", Current->name, Current->beizhu, Current->number);
- printf("修改成功!\n");
- }
- }
- }
复制代码
|
|