温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

学生信息管理系统 理解

发布时间:2020-06-13 11:22:01 来源:网络 阅读:380 作者:紫蝶烟影 栏目:编程语言

#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#define N 3
typedef struct node
{
  char name[20];
  struct node *link;
}stud;
给node起“外号”使其命名为stud。
stud * creat(int n) /*建立单链表的函数*/
{
  stud *p,*h,*s;  //定义3个指针,其中*h为头指针
   inti;
  if((h=(stud *)malloc(sizeof(stud)))==NULL)  //如果*h的动态分配中stud的内存为空则不能分配。所取得都是地址。
   {
     printf("不能分配内存空间!");
     exit(0);
   }
  h->name[0]='\0'; //把头指针name中的地址放干,也就是为0
  h->link=NULL;   //把头指针的第一项地址放空。头指针只有link这一项
  p=h;            //h的地址赋给p,这里指针所蕴含的是地址。指针与指针之间交换的都是地址。
  for(i=0;i<N;i++)
   {
    if((s= (stud *) malloc(sizeof(stud)))==NULL)//如果指针s的动态分配在stud中是空则显示不能分配
     {
       printf("不能分配内存空间!");
       exit(0);
     }
    p->link=s;     //p的指针地址提前向s申请分配,把s的name给p。s的下一个指针地址要永远为空,保证是最后一个。而且一定要让p->link得到s所有的数据。
    printf("请输入第%d个人的姓名:",i+1);
    scanf("%s",s->name);
    s->link=NULL;
    p=s;
   }
  return(h);         //返回头指针
}
stud * search(stud *h,char *x) /*查找函数*/
{
  stud *p;
  char *y;
   p=h->link;         //p获得头指针的下一个指针当p不为空时,p取得的name赋给y,然后让y和x比较,如果x和y的值相同也就是等于0.就证明找到了,否则就让p得到它的下一个指针数。再次重复,让y获得p的地址中name的地址。如果最后还是没有的话,说明并没有这个数据,显示没有。
   while(p!=NULL)
   {
    y=p->name;
    if(strcmp(y,x)==0)
      return(p);
    else p=p->link;
   }
  if(p==NULL)
     printf("没有查找到该数据!");
}
 
stud *search3(stud *h,char *x)
/*另一个查找函数,返回的是上一个查找函数的直接前驱结点的指针,
h为表头指针,x为指向要查找的姓名的指针
其实此函数的算法与上面的查找算法是一样的,只是多了一个指针s,并且s总是指向指针p所指向的结点的直接前驱,
结果返回s即是要查找的结点的前一个结点*/
{
  stud *p,*s;   //h 的link指针给p,h的值赋予给s当p不等于空时,y得到p地址的名字 ,两者比较如果y和x相同说明找到了人,然后返还给s。s现在担当为h。如果没有找到p就得到向下一个地址,s也得到下一个地址。然后循环在进行比较。如果还是没有也就是p的地址为空时,就说明没有数据了。
表头指针的link都属于第一个项
而非表头指针的link都属于下一项
   char *y;
  p=h->link;
  s=h;
  while(p!=NULL)
   {
    y=p->name;
    if(strcmp(y,x)==0)
      return(s);
    else
     {
      p=p->link;
      s=s->link;
     }
   }
  if(p==NULL)
   printf("没有查找到该数据!");
}
void insert(stud *p) /*插入函数,在指针p后插入*/
{
  char stuname[20];
  stud *s; /*指针s是保存新结点地址的*/
  if((s= (stud *) malloc(sizeof(stud)))==NULL)//新定义的s指针的动态分配在stud中如果为空就表示不可分配空间显示退出,如果不为空就证明有空间可以使用。设定stuname的值然后让s获取,在把p的下一个给s的下一个,然后s给p的下一个。
   {
    printf("不能分配内存空间!");
    exit(0);
   }
  printf("请输入你要插入的人的姓名:");
  scanf("%s",stuname);
  strcpy(s->name,stuname); /*把指针stuname所指向的数组元素拷贝给新结点的数据域*/
   s->link=p->link; /*把新结点的链域指向原来p结点的后继结点*/
   p->link=s;/*p结点的链域指向新结点*/
}
//   Y      Z 
        X
中间想要插入X那么就要先让Y的下一个指向给X的下一个指向。这样X的下一个就指向了Z,在把X自己给Y的下一个,这样就完成了插入。
 
void del(stud *x,stud *y) /*删除函数,其中y为要删除的结点的指针,x为要删除的结点的前一个结点的指针*/
{
  stud*s;
  s=y;
  x->link=y->link;  //   y的后一个指针赋予给x的后一个,相当于  X  Y  Z这么个关系,Y要被删掉,那么它的下一个指向Z就赋予给了X的下一个,这样的话,X的下一个就是Z了,  Y就没有用了。在清除掉S就算完成了删除任务。
  free(s);
}
 
 
void print(stud *h)
{
  stud *p;
  p=h->link;  //表头指针的link算是h的第一项给了P,这样p就有了h 的第一个地址。
  printf("数据信息为:\n");
  while(p!=NULL)
   {
    printf("%s \n",&*(p->name));
    p=p->link;
   }
}
 
 
void quit()
{
 exit(0);
}
void menu(void)
{
   system("cls");
   printf("\t\t\t单链表C语言实现实例\n");
   printf("\t\t|----------------|\n");
   printf("\t\t| |\n");
   printf("\t\t| [1] 建 立 新 表 |\n");
   printf("\t\t| [2] 查 找 数 据 |\n");
   printf("\t\t| [3] 插 入 数 据 |\n");
   printf("\t\t| [4] 删 除 数 据 |\n");
    printf("\t\t|[5] 打 印 数 据 |\n");
   printf("\t\t| [6] 退 出 |\n");
   printf("\t\t| |\n");
   printf("\t\t| 如未建立新表,请先建立! |\n");
   printf("\t\t| |\n");
   printf("\t\t|----------------|\n");
   printf("\t\t 请输入你的选项(1-6):");
}
main()
{
   int choose;
    stud *head,*searchpoint,*forepoint;
   char fullname[20];
 
   while(1)
    {
     menu();
     scanf("%d",&choose);
     switch(choose)
     {
       case 1:
          head=creat(N);
          break;
       case 2:
                 printf("输入你所要查找的人的姓名:");
          scanf("%s",fullname);
          searchpoint=search(head,fullname);
          printf("你所查找的人的姓名为:%s",*&searchpoint->name);
          printf("\n按回车键回到主菜单。");
          getchar();getchar();
          break;
       case 3: printf("输入你要在哪个人后面插入:");
          scanf("%s",fullname);
          searchpoint=search(head,fullname);
          printf("你所查找的人的姓名为:%s",*&searchpoint->name);
          insert(searchpoint);
          print(head);
          printf("\n按回车键回到主菜单。");
          getchar();getchar();
          break;
       case 4:
                 print(head);
          printf("\n输入你所要删除的人的姓名:");
          scanf("%s",fullname);
          searchpoint=search(head,fullname);
          forepoint=search3(head,fullname);
          del(forepoint,searchpoint);
          break;
       case 5:
                 print(head);
          printf("\n按回车键回到主菜单。");
          getchar();getchar();
          break;
       case 6:quit();
          break;
       default:
                 printf("你输入了非法字符!按回车键回到主菜单。");
          system("cls");
          menu();
           getchar();
      }
   }
}
 最后运用了“选择” ,while(1)死循环,getchar();getchar()如果没有getchar()阻止,那么界面就会无限刷新,因为while(1)是个死循环。保持界面一直在。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI