马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
单链表中,查了很多遍没查出原因,求大师帮忙
顺便想问,可不可以一次性将单链表的数据写出文件我试了一下,没成功
如果有,可否给个例子代码,谢谢
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- typedef struct Telbook
- {
- char name[12];
- char beizhu[24];
- unsigned long long number;
- struct Telbook *next;
- } PLR,*PLRPIN;
- void PrintInfo(PLRPIN Info);
- void InsertInfo(PLRPIN *Info); //把地址给它,用*把系统分给头指针的地址里的值拿出来做修改,就可以指向其它的值,所以要两层引用
- void InputInfo(PLRPIN);
- void releaseInfo(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;
- printf("\n|-------------------------------|菜单|-----------------------------------|\n\n");
- printf("| 1.显示所有名片|2.查找名片|3.删除名片|4.修改名片|5.新建名片|0.退出 |\n\n");
- printf("|--------------------------------------------------------------------------|\n");
- do
- {
- printf("\n请输入数字选择菜单:");
- reInput:
- scanf("%d",&iMenu);
- switch(iMenu)
- {
- case ME_ALLCARD:
- PrintInfo(Headr);
- break;
- case ME_FOUNDCARD:
- break;
- case ME_DELCARD:
- 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:
- 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 InsertInfo(PLRPIN *Info) //传入指向指针结构的指针来修改指针
- {
- PLRPIN Temp,New;
- New=(PLRPIN)malloc(sizeof(PLRPIN));
- if(NULL == New)
- {
- printf("新的空间分配失败\n");
- return ;
- }
- InputInfo(New);
- if(*Info != NULL)
- {
- Temp=*Info; //把头指针放入TEMP 再把新的转接赋值达到插入的目的。
- *Info=New;
- New->next=Temp;
- }
- else
- {
- *Info=New;
- New->next=NULL;
- }
-
- }
- void InputInfo(PLRPIN Info)
- {
-
- printf("请输入姓名:");
- scanf("%s",Info->name);
- printf("请给人物添加备注:");
- scanf("%s",Info->beizhu);
- printf("请输入号码:");
- scanf("%llu",&Info->number);
- }
- void PrintInfo(PLRPIN Info)
- {
-
- PLRPIN New;
- int count =1;
- New=Info;
- printf("\n\n----------------------------------------------------------------------------\n");
- printf("|编号| |姓名| |备注| |联系方式| \n");
- while(New != NULL )
- {
- printf(" %d %s %s %llu \n",count,New->name,New->beizhu,New->number);
- New=New->next;
- count++;
- }
- }
- void releaseInfo(PLRPIN *Info)
- {
- PLRPIN Temp;
- while (*Info != NULL)
- {
- Temp=*Info;
- *Info=(*Info)->next;
- free(Temp);
- }
- }
复制代码
- if(*Info != NULL)
- {
- Temp=*Info; //把头指针放入TEMP 再把新的转接赋值达到插入的目的。
- *Info=New;
- New->next=Temp;
- }
复制代码
我个人的感觉,你可能在这儿有点“乱”
我们先假设是第一个插入的
执行
{
*Info=New;
New->next=NULL;
}
这两个命令
Header有了真的值,
如果第二次插入,那么就执行
{
Temp=*Info;
*Info=New;
New->next=Temp;
}
而第一结构体就是当前代码中的*Info
一顿操作之后,请问原来*Info->next是什么呢?或者说temp->next是啥呢?这个不应该指向的是new吗?
以上个人的理解,不知对不对,不对请大佬更正!
|