學(xué)生信息管理系統(tǒng)理解

#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起“外號(hào)”使其命名為stud。
stud * creat(int n) /*建立單鏈表的函數(shù)*/
{
  stud *p,*h,*s;  //定義3個(gè)指針,其中*h為頭指針
   inti;
  if((h=(stud *)malloc(sizeof(stud)))==NULL)  //如果*h的動(dòng)態(tài)分配中stud的內(nèi)存為空則不能分配。所取得都是地址。
   {
     printf("不能分配內(nèi)存空間!");
     exit(0);
   }
  h->name[0]='\0'; //把頭指針name中的地址放干,也就是為0
  h->link=NULL;   //把頭指針的第一項(xiàng)地址放空。頭指針只有l(wèi)ink這一項(xiàng)
  p=h;            //h的地址賦給p,這里指針?biāo)N(yùn)含的是地址。指針與指針之間交換的都是地址。
  for(i=0;i<N;i++)
   {
    if((s= (stud *) malloc(sizeof(stud)))==NULL)//如果指針s的動(dòng)態(tài)分配在stud中是空則顯示不能分配
     {
       printf("不能分配內(nèi)存空間!");
       exit(0);
     }
    p->link=s;     //p的指針地址提前向s申請分配,把s的name給p。s的下一個(gè)指針地址要永遠(yuǎn)為空,保證是最后一個(gè)。而且一定要讓p->link得到s所有的數(shù)據(jù)。
    printf("請輸入第%d個(gè)人的姓名:",i+1);
    scanf("%s",s->name);
    s->link=NULL;
    p=s;
   }
  return(h);         //返回頭指針
}
stud * search(stud *h,char *x) /*查找函數(shù)*/
{
  stud *p;
  char *y;
   p=h->link;         //p獲得頭指針的下一個(gè)指針當(dāng)p不為空時(shí),p取得的name賦給y,然后讓y和x比較,如果x和y的值相同也就是等于0.就證明找到了,否則就讓p得到它的下一個(gè)指針數(shù)。再次重復(fù),讓y獲得p的地址中name的地址。如果最后還是沒有的話,說明并沒有這個(gè)數(shù)據(jù),顯示沒有。
   while(p!=NULL)
   {
    y=p->name;
    if(strcmp(y,x)==0)
      return(p);
    else p=p->link;
   }
  if(p==NULL)
     printf("沒有查找到該數(shù)據(jù)!");
}
 
stud *search3(stud *h,char *x)
/*另一個(gè)查找函數(shù),返回的是上一個(gè)查找函數(shù)的直接前驅(qū)結(jié)點(diǎn)的指針,
h為表頭指針,x為指向要查找的姓名的指針
其實(shí)此函數(shù)的算法與上面的查找算法是一樣的,只是多了一個(gè)指針s,并且s總是指向指針p所指向的結(jié)點(diǎn)的直接前驅(qū),
結(jié)果返回s即是要查找的結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)*/
{
  stud *p,*s;   //h 的link指針給p,h的值賦予給s當(dāng)p不等于空時(shí),y得到p地址的名字 ,兩者比較如果y和x相同說明找到了人,然后返還給s。s現(xiàn)在擔(dān)當(dāng)為h。如果沒有找到p就得到向下一個(gè)地址,s也得到下一個(gè)地址。然后循環(huán)在進(jìn)行比較。如果還是沒有也就是p的地址為空時(shí),就說明沒有數(shù)據(jù)了。
表頭指針的link都屬于第一個(gè)項(xiàng)
而非表頭指針的link都屬于下一項(xiàng)
   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("沒有查找到該數(shù)據(jù)!");
}
void insert(stud *p) /*插入函數(shù),在指針p后插入*/
{
  char stuname[20];
  stud *s; /*指針s是保存新結(jié)點(diǎn)地址的*/
  if((s= (stud *) malloc(sizeof(stud)))==NULL)//新定義的s指針的動(dòng)態(tài)分配在stud中如果為空就表示不可分配空間顯示退出,如果不為空就證明有空間可以使用。設(shè)定stuname的值然后讓s獲取,在把p的下一個(gè)給s的下一個(gè),然后s給p的下一個(gè)。
   {
    printf("不能分配內(nèi)存空間!");
    exit(0);
   }
  printf("請輸入你要插入的人的姓名:");
  scanf("%s",stuname);
  strcpy(s->name,stuname); /*把指針stuname所指向的數(shù)組元素拷貝給新結(jié)點(diǎn)的數(shù)據(jù)域*/
   s->link=p->link; /*把新結(jié)點(diǎn)的鏈域指向原來p結(jié)點(diǎn)的后繼結(jié)點(diǎn)*/
   p->link=s;/*p結(jié)點(diǎn)的鏈域指向新結(jié)點(diǎn)*/
}
//   Y      Z 
        X
中間想要插入X那么就要先讓Y的下一個(gè)指向給X的下一個(gè)指向。這樣X的下一個(gè)就指向了Z,在把X自己給Y的下一個(gè),這樣就完成了插入。
 
void del(stud *x,stud *y) /*刪除函數(shù),其中y為要?jiǎng)h除的結(jié)點(diǎn)的指針,x為要?jiǎng)h除的結(jié)點(diǎn)的前一個(gè)結(jié)點(diǎn)的指針*/
{
  stud*s;
  s=y;
  x->link=y->link;  //   y的后一個(gè)指針賦予給x的后一個(gè),相當(dāng)于  X  Y  Z這么個(gè)關(guān)系,Y要被刪掉,那么它的下一個(gè)指向Z就賦予給了X的下一個(gè),這樣的話,X的下一個(gè)就是Z了,  Y就沒有用了。在清除掉S就算完成了刪除任務(wù)。
  free(s);
}
 
 
void print(stud *h)
{
  stud *p;
  p=h->link;  //表頭指針的link算是h的第一項(xiàng)給了P,這樣p就有了h 的第一個(gè)地址。
  printf("數(shù)據(jù)信息為:\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語言實(shí)現(xiàn)實(shí)例\n");
   printf("\t\t|----------------|\n");
   printf("\t\t| |\n");
   printf("\t\t| [1] 建 立 新 表 |\n");
   printf("\t\t| [2] 查 找 數(shù) 據(jù) |\n");
   printf("\t\t| [3] 插 入 數(shù) 據(jù) |\n");
   printf("\t\t| [4] 刪 除 數(shù) 據(jù) |\n");
    printf("\t\t|[5] 打 印 數(shù) 據(jù) |\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 請輸入你的選項(xiàng)(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("輸入你要在哪個(gè)人后面插入:");
          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輸入你所要?jiǎng)h除的人的姓名:");
          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();
      }
   }
}
 最后運(yùn)用了“選擇” ,while(1)死循環(huán),getchar();getchar()如果沒有g(shù)etchar()阻止,那么界面就會(huì)無限刷新,因?yàn)閣hile(1)是個(gè)死循環(huán)。保持界面一直在。

隆林網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站開發(fā)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)公司2013年至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

文章標(biāo)題:學(xué)生信息管理系統(tǒng)理解
URL標(biāo)題:http://www.muchs.cn/article4/ihejoe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站App開發(fā)、網(wǎng)站策劃、動(dòng)態(tài)網(wǎng)站、網(wǎng)站改版、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站