鱼C论坛

 找回密码
 立即注册
查看: 1024|回复: 1

[已解决]单链表的删除

[复制链接]
发表于 2021-12-14 17:21:29 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>

  4. char adminname[20] = "admin1";
  5. char adminpassword[20] = "a123456";

  6. struct Date
  7. {
  8.         int year;
  9.         int month;
  10.         int day;
  11. };

  12. typedef struct Infor
  13. {
  14.         char name[20];
  15.         char gender[10];
  16.         int age;
  17.         char address[30];
  18.         char buytype[50];
  19.         char color[20];
  20.         long price;
  21.         struct Date date;
  22.         struct Infor *next;
  23. }INFOR,*Pointer;

  24. Pointer infor = NULL;

  25. int login(void);
  26. void Menushow(void);
  27. void Add(Pointer *infor);
  28. void Modify(Pointer *infor);
  29. void Show(Pointer *infor);
  30. void Search_name(Pointer *infor);
  31. void Printuser(Pointer *infor);
  32. void Del(Pointer *infor);
  33. //void Sort(Pointer infor);
  34. void Loadfromfile(void);
  35. void Xuigai(char adminname[],char adminpassword[]);
  36. void Release(Pointer *infor);


  37. void Release(Pointer *infor)
  38. {
  39.         Pointer temp, p =*infor;
  40.         while(p == NULL)
  41.         {
  42.                 temp = p;
  43.                 p = p->next;
  44.                 free(temp);
  45.                
  46.         }
  47. }
  48. int login(void)
  49. {
  50.         char username[20];
  51.         char userpassword[20];
  52.         printf("请输入用户名:");
  53.         gets(username);
  54.         printf("请输入密码:");
  55.         gets(userpassword);
  56.        
  57.         if(!strcmp(adminname,username) && !strcmp(adminpassword,userpassword))
  58.         {
  59.                 return 1;
  60.         }
  61.         else
  62.         {
  63.                 return 0;
  64.         }
  65. }
  66. void Menushow(void)
  67. {
  68.         int i;
  69.         printf("\n");
  70.         printf("  |----1.增加购买电瓶车用户信息-----|\n");
  71.         printf("  |----2.修改购买电瓶车用户信息-----|\n");
  72.         printf("  |----3.显示购买电瓶车用户信息-----|\n");
  73.         printf("  |----4.查询用户信息---------------|\n");
  74.         printf("  |----5.删除用户信息---------------|\n");
  75.         printf("  |----6.按购买日期进行排序---------|\n");
  76.         printf("  |----7.从文件中读取用户信息-------|\n");
  77.         printf("  |----8.将购买用户信息保存到文件---|\n");
  78.         printf("  |----9.修改密码-------------------|\n");
  79.         printf("  |----10.退出系统------------------|\n");
  80.         printf("\n");
  81.         printf("请输入你选择的编号:");
  82.         scanf("%d",&i);
  83.         do
  84.         {
  85.                 switch(i)
  86.                 {
  87.                         case 1:Add(&infor);break;
  88.                         case 2:Modify(&infor);break;
  89.                         case 3:Show(&infor);break;
  90.                         case 4:Search_name(&infor);break;
  91.                         case 5:Del(&infor);break;
  92.                         //case 6:Sort(&infor);break;
  93.                         case 7:Loadfromfile();break;
  94.                         //case 8:Save();break;
  95.                         case 9:Xuigai(adminname,adminpassword);break;
  96.                         //case 10:Quit();break;
  97.                 }
  98.         }while(i < 1 || i > 10);
  99. }
  100. void Add(Pointer *infor)
  101. {
  102.         Pointer p;
  103.         static Pointer tail;
  104.         char ch;
  105.         do{
  106.        
  107.                 p = (Pointer)malloc(sizeof(INFOR));
  108.                
  109.                 if(p == NULL)
  110.                 {
  111.                         printf("内存分配失败\n");
  112.                         exit(1);
  113.                 }
  114.                 getchar();
  115.                 printf("请输入姓名:");
  116.                 gets(p->name);
  117.                 printf("请输入性别(男/女):");
  118.                 scanf("%s",p->gender );
  119.                 printf("请输入年龄:");
  120.                 scanf("%d",&p->age);
  121.                 printf("请输入地址:");
  122.                 scanf("%s",p->address );
  123.                 printf("请输入购品牌和型号:");
  124.                 scanf("%s",p->buytype );
  125.                 printf("请输入购买的颜色:");
  126.                 scanf("%s",p->color );
  127.                 printf("请输入价格:");
  128.                 scanf("%ld",&p->price );
  129.                 printf("请输入购买时间:(yyyy-mm-dd):");
  130.                 scanf("%d-%d-%d",&p->date.year,&p->date.month ,&p->date.day);
  131.                
  132.                 getchar();
  133.                
  134.                 printf("请问是否需要继续插入用户信息(Y/N):");
  135.                 ch = getchar();
  136.                 if((*infor )!= NULL)
  137.                 {
  138.                         tail->next = p;
  139.                         p->next = NULL;
  140.                 }
  141.                 else
  142.                 {
  143.                         (*infor )= p;
  144.                         p->next = NULL;
  145.                 }
  146.                 tail = p;
  147.         }while(ch == 'Y' || ch == 'y');

  148.        
  149. }
  150. void Modify(Pointer *infor)
  151. {
  152.         int t = 0;
  153.         Pointer p = *infor;
  154.         int flag = 0;
  155.         char sename[20];
  156.         if(p == NULL)
  157.         {
  158.                 printf("并未存在任何数据,不能进行修改!!");
  159.                 return ;
  160.         }
  161.         getchar();
  162.         printf("请输入你要修改的用户名字:");
  163.         gets(sename);
  164.        
  165.         while(p != NULL)
  166.         {
  167.                 if(!strcmp(sename,p->name))
  168.                 {
  169.                         flag = 0;
  170.                         printf("请输入修改后的信息:\n");
  171.                         printf("请输入姓名:");
  172.                         scanf("%s",p->name );
  173.                         printf("请输入性别(男/女):");
  174.                         scanf("%s",p->gender );
  175.                         printf("请输入年龄:");
  176.                         scanf("%d",&p->age);
  177.                         printf("请输入地址:");
  178.                         scanf("%s",p->address );
  179.                         printf("请输入购品牌和型号:");
  180.                         scanf("%s",p->buytype );
  181.                         printf("请输入购买的颜色:");
  182.                         scanf("%s",p->color );
  183.                         printf("请输入价格:");
  184.                         scanf("%ld",&p->price );
  185.                         printf("请输入购买时间:(yyyy-mm-dd):");
  186.                         scanf("%d-%d-%d",&p->date.year,&p->date.month,&p->date.day);
  187.                         break;
  188.                 }
  189.                 else
  190.                 {
  191.                         flag = 1;
  192.                         p = p->next;
  193.                 }
  194.                 if(!flag)
  195.                 {
  196.                         t = 1;
  197.                 }
  198.         }
  199.         if(!t)
  200.         {
  201.                 printf("并未查询到存在该用户信息!!\n");
  202.         }
  203.        
  204. }
  205. void Show(Pointer *infor)
  206. {
  207.         Pointer p = *infor;
  208.         if(p == NULL)
  209.         {
  210.                 printf("\n暂时还未存入数据!!\n");
  211.                 printf("显示失败!!\n\n");
  212.         }
  213.         else
  214.         {
  215.                 while(p != NULL)
  216.                 {
  217.                         Printuser(&p);
  218.                         printf("^_^==========================^_^\n");
  219.                         p = p->next ;
  220.                 }
  221.         }
  222. }

  223. void Search_name(Pointer *infor)
  224. {
  225.         Pointer p = *infor;
  226.         char sename[20];
  227.         getchar();
  228.         printf("请输入你要查询的用户姓名:");
  229.         gets(sename);

  230.         while(p != NULL)
  231.         {
  232.                 if(!strcmp(sename,(p)->name))
  233.                 {
  234.                         printf("已查询到信息\n是否打印该用户信息(Y/N):\n");
  235.                         char ch = getchar();
  236.                         if(ch == 'Y'|| ch == 'y')
  237.                         {
  238.                                 Printuser(&p);
  239.                         }
  240.                 }
  241.                 p = p->next;
  242.         }
  243. }

  244. void Printuser(Pointer *infor)
  245. {
  246.                 Pointer p = *infor;
  247.                 printf("姓名:%s\n",p->name );
  248.                 printf("性别:%s\n",p->gender );
  249.                 printf("年龄:%d\n",p->age );
  250.                 printf("地址:%s\n",p->address );
  251.                 printf("购买品牌型号:%s\n",p->buytype );
  252.                 printf("颜色:%s\n",p->color );
  253.                 printf("价格:%ld\n",p->price);
  254.                 printf("购买时间:%d-%d-%d\n",p->date.year ,p->date.month ,p->date.day);
  255. }

  256. void Del(Pointer *infor)
  257. {
  258.         Pointer previous,current,new;
  259.         getchar();
  260.         current = *infor;
  261.         previous = NULL;
  262.        
  263.         char delname[20];
  264.         printf("请输入你要删除的用户姓名:");
  265.         gets(delname);
  266.        
  267.         while(strcmp(delname,current->name) && current != NULL)
  268.         {
  269.                 previous = current;
  270.                 current = current->next ;
  271.                 printf("进行循环了");
  272.         }
  273.         if(current == NULL)
  274.         {
  275.                 printf("并未找到该用户的信息");
  276.                 return ;
  277.         }
  278.         else
  279.         {
  280.                 if(previous == NULL)
  281.                 {
  282.                         current = current->next;
  283.                 }
  284.                 else
  285.                 {
  286.                         previous->next = current->next ;
  287.                 }
  288.                 printf("删除成功");
  289.                 free(current);
  290.         }
  291. }

  292. void Sort(Pointer infor)
  293. {
  294.         ;
  295. }

  296. void Xuigai(char adminname[],char adminpassword[])
  297. {
  298.         char username[20];
  299.         char userpassword[20];
  300.         getchar();
  301.                 printf("请输入用户名:");
  302.                 gets(username);
  303.                 printf("请输入密码:");
  304.                 gets(userpassword);       
  305.                 if(!strcmp(adminname,username) && !strcmp(adminpassword,userpassword))
  306.                 {
  307.                         while(1){
  308.                                 printf("请输入修改后的用户名:");
  309.                                 gets(adminname);
  310.                                 printf("请输入密码:");
  311.                                 gets(adminpassword);
  312.                                 printf("请再次输入密码:");
  313.                                 gets(userpassword);
  314.                                 if(!strcmp(adminpassword,userpassword))
  315.                                 {
  316.                                         printf("修改完毕");
  317.                                         return;
  318.                                 }
  319.                         }
  320.                 }
  321.                 else
  322.                 {
  323.                         printf("用户名或密码输入错误,系统自动退出!!\n");
  324.                 }
  325.                
  326.        

  327. }
  328. void Loadfromfile(void)
  329. {
  330.         FILE *fp = fopen("stdin","r");

  331.         if(fp == NULL)
  332.         {
  333.                 printf("读取文件失败!!");
  334.                 exit(0);
  335.         };
  336.         char xinxi[1024];

  337.         fgets(xinxi,1023,fp);

  338.         fclose(fp);

  339. }

  340. int main(void)
  341. {
  342.         int count = 3;
  343.         while(1)
  344.         {
  345.                 if(login())
  346.                 {
  347.                         printf("\n欢迎使用电瓶车信息管理系统^_^");
  348.                         printf("\n登陆成功\n");
  349.                        
  350.                         while(1)
  351.                         {
  352.                                 Menushow();
  353.                         }
  354.                        
  355.                 }
  356.                 else
  357.                 {
  358.                         count -= 1;
  359.                         printf("\n用户或密码输入错误\n请重新输入\n");
  360.                         if (count  == 0)
  361.                         {
  362.                                 printf("用户名或密码输入错误超过3次\n系统自动退出\n\n");
  363.                                 break;
  364.                         }
  365.                         else
  366.                         {
  367.                                 printf("你还有%d次机会\n\n",count);
  368.                         }
  369.                 }
  370.         }
  371.        
  372.        
  373.         return 0;
  374. }
复制代码



我的删除函数不能删除插入的第一个,为什莫,我明明写了
current = current->next
求解答
最佳答案
2021-12-14 17:34:34
本帖最后由 jhq999 于 2021-12-14 17:38 编辑
  1. void Del(Pointer *infor)
  2. {
  3.         Pointer previous,current,new;
  4.         getchar();
  5.         current = *infor;
  6.         previous = NULL;
  7.       
  8.         char delname[20];
  9.         printf("请输入你要删除的用户姓名:");
  10.         gets(delname);
  11.       
  12.         while(strcmp(delname,current->name) && current != NULL)
  13.         {
  14.                 previous = current;
  15.                 current = current->next ;
  16.                 printf("进行循环了");
  17.         }
  18.         if(current == NULL)
  19.         {
  20.                 printf("并未找到该用户的信息");
  21.                 return ;
  22.         }
  23.         else
  24.         {
  25.                 if(previous == NULL)
  26.                 {
  27.                         *infor = current->next;///////////既然是要删除开头(current),就应该把开头的位置交给第二个(current->next)
  28.                 }
  29.                 else
  30.                 {
  31.                         previous->next = current->next ;
  32.                 }
  33.                 printf("删除成功");
  34.                 free(current);
  35.         }
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-12-14 17:34:34 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jhq999 于 2021-12-14 17:38 编辑
  1. void Del(Pointer *infor)
  2. {
  3.         Pointer previous,current,new;
  4.         getchar();
  5.         current = *infor;
  6.         previous = NULL;
  7.       
  8.         char delname[20];
  9.         printf("请输入你要删除的用户姓名:");
  10.         gets(delname);
  11.       
  12.         while(strcmp(delname,current->name) && current != NULL)
  13.         {
  14.                 previous = current;
  15.                 current = current->next ;
  16.                 printf("进行循环了");
  17.         }
  18.         if(current == NULL)
  19.         {
  20.                 printf("并未找到该用户的信息");
  21.                 return ;
  22.         }
  23.         else
  24.         {
  25.                 if(previous == NULL)
  26.                 {
  27.                         *infor = current->next;///////////既然是要删除开头(current),就应该把开头的位置交给第二个(current->next)
  28.                 }
  29.                 else
  30.                 {
  31.                         previous->next = current->next ;
  32.                 }
  33.                 printf("删除成功");
  34.                 free(current);
  35.         }
  36. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 13:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表