找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2855|回复: 1
打印 上一主题 下一主题
收起左侧

c语言单链表实现学生信息的增删改查源程序

[复制链接]
跳转到指定楼层
楼主
C语言链表的基础知识就不多说了,关键在于要知道它是不连续的内存单元通过指针的方式把数据串接成链的。百度一大把资料。
直接对程序加以说明,以及注意事项:
1.添加信息:直接在创建的链表尾部添加。读者也可以自己试着修改成,链表指定位置添加。
2.删除信息:首先分三种情况,第一:删除的数据在表头,第二:删除的数据在表中间,最后,删除的数据是表尾(即next指向的是NULL)。
3.修改、查询信息:通过指定的方式去查找,比较简单没啥好说的。
4.登录:这里我设置了默认的账号密码,三次之内输入正确即可进入创建链表,否则退出进程。


思考:程序45行getchar()的作用?
在scanf中输入name信息后按回车结束,输入缓冲中保存了这个回车符,如果后面一个输入信息格式是字符(串)格式,
它会自动把这个回车符赋给这个信息,所以getchar的作用是吃掉这个回车符。

单片机源程序如下:
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "student.h"


  5. int main(int argv,char *argc[])
  6. {
  7.         Stu *head;
  8.         int entry,Num;
  9.         entry=login();
  10.         if(entry != 0)
  11.                 return -1;
  12.         head=creat();
  13.         print(head);
  14.         while(1){
  15.                 printf("input 1.添加  2.删除  3.修改  4.查询  5.打印  6.退出\n");
  16.                 scanf("%d",&Num);
  17.                 switch(Num){
  18.                         case 1:head=add(head);print(head);break;
  19.                         case 2:head=delet(head);print(head);break;
  20.                         case 3:head=modify(head);print(head);break;
  21.                         case 4:query(head);break;
  22.                         case 5:print(head);break;
  23.                         case 6:return 0;
  24.                         default:printf("Invalid input\n");break;
  25.                 }
  26.         }
  27.         return 0;
  28. }


  29. /*  创建学生链表  */
  30. Stu *creat(void)
  31. {
  32.         int n=0;
  33.         char i[4];
  34.         Stu *p1,*p2;
  35.         Stu *head = NULL;
  36.         p1=p2=(Stu *) malloc(sizeof(Stu));
  37.         do{
  38.                 printf("please input student info:\n");
  39.                 printf("name:");
  40.                 scanf("%s",p1->name);
  41.                 getchar();
  42.                 printf("sex:");
  43.                 scanf("%c",&p1->sex);
  44.                 printf("num:");
  45.                 scanf("%d",&p1->num);
  46.                 printf("score:");
  47.                 scanf("%f",&p1->score);
  48.                 printf("addr:");
  49.                 scanf("%s",p1->addr);
  50.                 if(!n){
  51.                         n++;
  52.                         head=p1;
  53.                 }else{

  54.                         p2->next=p1;
  55.                         p2=p1;
  56.                 }
  57.                 printf("whether input next:yes/no\n");
  58.                 scanf("%s",i);
  59.                 if(!strncmp(i,"y",1)){
  60.                         p1=(Stu *)malloc(sizeof(Stu));
  61.                 }else{
  62.                         p1->next = NULL;

  63.                 }
  64.         }while(!strncmp(i,"y",1));

  65.         return head;
  66. }


  67. /*   添加学生信息   */
  68. Stu *add(Stu *p)
  69. {
  70.         Stu *q,*head;
  71.         head = p;
  72.         char i[4];

  73.         while(p->next != NULL){
  74.                 p=p->next;
  75.         }

  76.         q=(Stu *) malloc(sizeof(Stu));
  77.         do{
  78.                 printf("please add student info:\n");
  79.                 printf("name:");
  80.                 scanf("%s",q->name);
  81.                 getchar();
  82.                 printf("sex:");
  83.                 scanf("%c",&q->sex);
  84.                 printf("num:");
  85.                 scanf("%d",&q->num);
  86.                 printf("score:");
  87.                 scanf("%f",&q->score);
  88.                 printf("addr:");
  89.                 scanf("%s",q->addr);
  90.                 p->next = q;
  91.                 p=q;
  92.                 printf("whether add next:yes/no\n");
  93.                 scanf("%s",i);
  94.                 if(!strncmp(i,"y",1)){
  95.                         q=(Stu *) malloc(sizeof(Stu));
  96.                 }else{

  97.                         q->next= NULL;
  98.                 }
  99.         }while(!strncmp(i,"y",1));

  100.         return head;
  101. }


  102. /*   删除学生信息    */
  103. Stu *delet(Stu *p)
  104. {
  105.         Stu *q,*head;
  106.         int Num;
  107.         char i[4];
  108.         head = q= p;
  109.         if(!p)
  110.                 return head;
  111.         do{
  112.                 printf("please input delete student num:");
  113.                 scanf("%d",&Num);
  114.                 while(p->num !=Num){
  115.                         if(p->next!=NULL){
  116.                                 if(q!=p){
  117.                                         q->next=p;
  118.                                         q=p;
  119.                                 }
  120.                                 p=p->next;
  121.                         }else{
  122.                                 printf("No find the student,sorry!\n");
  123.                                 return head;
  124.                         }
  125.                 }
  126.                 if(p==head){
  127.                         head=p->next;
  128.                 }else if(p->next ==NULL){
  129.                         q->next=NULL;
  130.                 }else{
  131.                         q->next=p->next;
  132.                 }
  133.                 free(p);
  134.                 printf("whether delete again:yes/no?\n");
  135.                 scanf("%s",i);

  136.         }while(!strncmp(i,"y",1));

  137.         return head;
  138. }


  139. /*   修改学生信息    */
  140. Stu *modify(Stu *p)
  141. {
  142.         Stu *head;
  143.         char i[4];
  144.         int Num,y;
  145.         head=p;
  146.         printf("please modify student num:");
  147.         scanf("%d",&Num);
  148.         do{
  149.                 while(p->num!= Num){
  150.                         if(p->next!=NULL){
  151.                                 p=p->next;
  152.                         }else{
  153.                                 printf("No find the student,sorry!\n");
  154.                                 return head;
  155.                         }                        
  156.                 }
  157.                 printf("Do you want to modify 1.name  2.num  3.sex  4.score  5.addr?");
  158.                 scanf("%d",&y);
  159.                 switch(y){
  160.                         case 1:printf("name:"); scanf("%s",p->name);break;
  161.                         case 2:printf("num:"); scanf("%d",&p->num);break;
  162.                         case 3:printf("sex:"); scanf("%c",&p->sex);break;
  163.                         case 4:printf("score:"); scanf("%f",&p->score);break;
  164.                         case 5:printf("addr:"); scanf("%s",p->addr);break;
  165.                         default:printf("input error!\n");break;
  166.                 }
  167.                 printf("whether modify again:yes/no?\n");
  168.                 scanf("%s",i);
  169.         }while(!strncmp(i,"y",1));

  170.         return head;
  171. }


  172. /*   查询学生信息    */
  173. void query(Stu *p)
  174. {
  175.         int Num;
  176.         printf("Please input student num:");
  177.         scanf("%d",&Num);
  178.         while(p->num != Num){
  179.                 if(p->next == NULL){
  180.                         printf("No find the student ,sorry!\n");
  181.                         exit(-1);
  182.                 }
  183.                 p= p->next;
  184.         }        
  185.         printf("name=%s ,sex=%c ,score=%4.2f ,addr=%s\n",p->name,p->sex,p->score,p->addr);

  186. }


  187. /*    账号登录    */
  188. int login(void)
  189. {
  190.         int i=0;
  191.         char wel[]="Welcome to entery the student system!";
  192.         int len=sizeof(wel);
  193.         char account_new[16],account[]="class_student";
  194.         char passwd_new[16],passwd[]="123456";
  195.         printf("defaule:: 账号:class_student  密码:123456\n");
  196.         printf("if error 3 times exit\n");
  197.         for(i=0;i<3;i++){
  198.                 printf("please input your 账号:");
  199.                 scanf("%s",account_new);
  200.                 printf("please input your 密码:");
  201.                 scanf("%s",passwd_new);
  202.                 if((!strncmp(account,account_new,strlen(account))) &&
  203.                         (!strncmp(passwd,passwd_new,strlen(passwd)))) {
  204.                         printf("succeeful!\n");
  205.                         break;
  206.                 }else{
  207.                         if(i==2)
  208.                                 return -1;
  209.                         printf("error!\n");
  210.                 }
  211.         }
  212.         printf("%s",wel);
  213.         printf("\n");
  214.         return 0;

  215. }


  216. /*   信息打印    */
  217. void print(Stu *p)
  218. {
  219.         if(!p)
  220.                 return;
  221.         do{
  222.                 printf("name:%s ,sex:%c ,num:%d , score:%4.2f ,addr:%s \n",p->name,p->sex,p->num,p->score,p->addr);
  223.                 p=p->next;
  224.         }while(p != NULL);

  225. }
复制代码

所有资料51hei提供下载:
c语言之单链表.zip (7.48 KB, 下载次数: 18)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:276663 发表于 2021-1-13 12:51 | 只看该作者
有没有循环链表?
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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