• 单链表


      1 /*用链表实现学生成绩信息的管理*/
      2 #include "stdio.h"
      3 #include "stdlib.h"
      4 #include "string.h"
      5 struct stud_node
      6 {
      7     int num;
      8     char name[20];
      9     int score;
     10     struct stud_node*next;
     11 };
     12 
     13 /*函数声明*/
     14 struct stud_node *Creat_Stu_Doc();//新建链表
     15 struct stud_node *InsertDoc(struct stud_node *head,struct stud_node *stud);//插入
     16 struct stud_node *DeleteDoc(struct stud_node *head,int num);//删除
     17 void Print_Stu_Doc(struct stud_node *head);//遍历
     18 
     19 /*主函数*/
     20 int main()
     21 {
     22     struct stud_node *head,*p;
     23     int choice,num,score;
     24     char name[20];
     25     int size=sizeof(struct stud_node);
     26 
     27     do 
     28     {
     29         printf("1.Creat 2.Insert 3.Delete 4.Print 0.Exit 
    ");
     30         scanf("%d",&choice);
     31         switch (choice)
     32         {
     33         case 1:
     34             head=Creat_Stu_Doc();
     35             break;
     36         case 2:
     37             printf("Input num,name and score:
    ");
     38             scanf("%d%s%d",&num,&name,&score);
     39             p=(struct stud_node*)malloc(size);
     40             p->num=num;
     41             strcpy(p->name,name);
     42             p->score=score;
     43             head=InsertDoc(head,p);
     44             break;
     45         case 3:
     46             printf("Input num:
    ");
     47             scanf("%d",&num);
     48             head=DeleteDoc(head,num);
     49             break;
     50         case 4:
     51             Print_Stu_Doc(head);
     52             break;
     53         case 0:
     54             break;
     55         }
     56     } while (choice!=0);
     57 
     58     return 0;
     59 }
     60 
     61 //新建链表
     62 struct stud_node *Creat_Stu_Doc()
     63 {
     64     struct stud_node *head,*p;
     65     int num,score;
     66     char name[20];
     67     int size=sizeof(struct stud_node);
     68 
     69     head=NULL;
     70     printf("Input num,name and score:
    ");
     71     scanf("%d%s%d",&num,&name,&score);
     72     while (num!=0)
     73     {
     74         p=(struct stud_node*)malloc(size);
     75         p->num=num;
     76         strcpy(p->name,name);
     77         p->score=score;
     78         head=InsertDoc(head,p);
     79         scanf("%d%s%d",&num,&name,&score);
     80     }
     81     return head;
     82 }
     83 
     84 //插入操作
     85 struct stud_node *InsertDoc(struct stud_node *head,struct stud_node *stud)
     86 {
     87     struct stud_node *ptr,*ptr1,*ptr2;
     88 
     89     ptr2=head;
     90     ptr=stud;//ptr指向待插入的新的学生记录结点
     91     //原链表为空时的插入
     92     if (head==NULL)
     93     {
     94         head=ptr;            //新插入结点成为头结点
     95         head->next=NULL;
     96     }
     97     else                    //原链表不为空时的插入
     98     {
     99         while ((ptr->num>ptr2->num)&&(ptr2->next!=NULL))
    100         {
    101             ptr1=ptr2;                    //ptr1,ptr2各后移一个结点
    102             ptr2=ptr2->next;
    103         }
    104         if (ptr->num<=ptr2->num)        //在ptr1与ptr2之间插入新结点
    105         {
    106             if(head==ptr2)
    107                 head=ptr;
    108             else
    109                 ptr1->next=ptr;
    110         }
    111         else                //新插入结点成为尾结点
    112         {
    113             ptr2->next=ptr;
    114             ptr->next=NULL;
    115         }
    116     }
    117     return head;
    118 }
    119 
    120 //删除操作
    121 struct stud_node *DeleteDoc(struct stud_node *head,int num)
    122 {
    123     struct stud_node *ptr1,*ptr2;
    124 
    125     //要被删除结点为表头结点
    126     while (head!=NULL&&head->num==num)
    127     {
    128         ptr2=head;
    129         head=head->next;
    130         free(ptr2);
    131     }
    132     if(head==NULL)        //链表空
    133         return NULL;
    134     //要被删除结点为非表头结点
    135     ptr1=head;
    136     ptr2=head->next;    //从表头的下一个结点搜索所有符合删除要求的结点
    137     while(ptr2!=NULL)
    138     {
    139         if (ptr2->num==num)        //ptr2所指结点符合删除要求
    140         {
    141             ptr1->next=ptr2->next;
    142             free(ptr2);
    143         }
    144         else
    145             ptr1=ptr2;        //ptr1后移一个结点
    146         ptr2=ptr1->next;    //ptr2指向ptr1的后一个结点
    147     }
    148     return head;
    149 }
    150 
    151 //遍历操作
    152 void Print_Stu_Doc(struct stud_node *head)
    153 {
    154     struct stud_node *ptr;
    155     if (head==NULL)
    156     {
    157         printf("
    No Records
    ");
    158         return;
    159     }
    160     printf("
    The Students' Records Are:
    ");
    161     printf("Num	 Name	 Score
    ");
    162     for(ptr=head;ptr!=NULL;ptr=ptr->next)
    163         printf("%d	%s	%d
    ",ptr->num,ptr->name,ptr->score);
    164 }
  • 相关阅读:
    [BZOJ1659][Usaco2006 Mar]Lights Out 关灯
    [BZOJ1789][BZOJ1830][Ahoi2008]Necklace Y型项链
    [HDU5015]233 Matrix
    [BZOJ1786][BZOJ1831]逆序对
    各种音视频编解码学习详解
    Methods and systems for sharing common job information
    在nodejs使用Redis缓存和查询数据及Session持久化(Express)
    jQuery 遍历 – 同胞(siblings)
    jQuery 遍历 – 后代
    jQuery 遍历 – 祖先
  • 原文地址:https://www.cnblogs.com/XHR-1314/p/6595158.html
Copyright © 2020-2023  润新知