马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
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吗?
以上个人的理解,不知对不对,不对请大佬更正!
|