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