• C语言 单向 动态链表的增 删 改 查操作, 非常易懂!


      很基础 我也是小白如果可以提供到一些帮助 请往下看,有问题可以指出!!

    下面是运行效果图:

     如果有问题可以指出,留言:

    下面是代码 也没啥好讲的: 注意结构体的指针调用问题就好了 ,分清楚指针和指向指针的指针就好了

      1 //全局结构体 struct
      2 typedef struct Stu {
      3     union {
      4         int num;
      5         char name[10];
      6     }Stu;
      7     int num;
      8     int age;
      9     char name[10];
     10     struct Stu* Next;
     11 }Stus;
     12 
     13 //定义个人用户方法操作
     14 typedef struct _list {  
     15     Stus* head; 
     16 }List;
     17 //清除整个链表
     18 static void throughtdel(Stus* p);
     19 static void select(Stus* p);//显示
     20 static void searchs(Stus* p);//搜索
     21 #define Len sizeof(Stus)
     22 //动态链表*单向
     23 static int LS = 0;
     24 //建立链表结构 33 static void createtable(List *plist) {
     34     printf("建立链表 请输入:索引   姓名 (输入0结束))
    ");    
     35     Stus* a, * b;
     36     plist->head = NULL;
     37     a = b = malloc(Len);
     38     //赋值
     39     scanf("%d %s", &a->num, &a->name);
     40     while (a->num!=0)
     41     {
     42         LS++;
     43         if (LS == 1)plist->head= a;
     44         else  b->Next = a;
     45         b = a;
     46         a = malloc(Len);
     47         //赋值
     48         //printf("请输入:编号   姓名(输入0结束))
    ");
     49         scanf("%d %s", &a->num, &a->name);
     50         if (a->num == 0)break;
     51     }
     52     b->Next = NULL;
     79 }
     80 //删除 某节点
     81 static void dynamictable(List * list) {
     82     Stus*q,*p;
     83     /*List list;
     84     list.head =head;*/
     85     int number;
     86     printf("删除操作(输入索引):
    ");
     87     scanf("%d", &number);
     88     for (q=NULL, p= list->head;p ;q=p, p=p->Next)
     89     {
     90         if (p->num==number)
     91         {
     92             printf("删除后
    ");
     93             //删除
     94             if (q) { //首位的是时候 q指向的
     95                 q->Next = p->Next; 
     96                 free(p);
     97                 select(list->head);
     98                 break;
     99             }
    100             else { //如果首位怎么办? 
    101                 list->head = p->Next;
    102                 free(p);
    103                 select(list->head);
    104                 break;
    105             }
    106         }
    107     }
    108 }
    109 //删除方法二 
    110 static void del(List* list) {
    111     Stus* q=list->head,*d=NULL;
    112     if (q==NULL)
    113     {
    114         printf("nlist null!");
    115         return;
    116     }
    117     else {
    118         int c = NULL;
    119         printf("请输入删除数下标:");
    120         scanf("%d", &c);
    121         while (q->num!=c&&q->Next!=NULL)
    122         {
    123             d = q;
    124             q = q->Next;
    125         }
    126         if (q->num==c)
    127         {
    128             if (q==list->head)//首位
    129             {
    130             list->head = q->Next; //首位改变
    131             return;
    132             }
    133             else {
    134                 d->Next = q->Next;
    135                 free(q);
    136                 return;
    137             }
    138         }
    139         else {
    140             printf("没有找到要删除的元素");
    141         }
    142 
    143     }
    144 
    145 }
    146 //显示全部节点
    147 static void select(Stus* p) {
    148     printf("---------------------------查询结果-----------------------------------
    ");
    149     for (; p; p = p->Next)
    150     {
    151         printf("%d %s
    ", p->num, p->name);
    152     }
    153     printf("---------------------------------------------------------------------
    ");
    154     return;
    155 }
    156 //搜索
    157 static void searchs(Stus *p) {
    158     int s = 1,number=NULL;
    159     printf("请输入搜索的索引:"); scanf("%d", &number);
    160     for (; p; p = p->Next)
    161     {
    162         if(number==p->num){
    163             s = 0;
    164         printf("已找到: %d     %s 
    
    ", p->num, p->name);
    165         //break;
    166         }
    167     }
    168     if (s)printf("没有找到!");
    169     return;
    170 }
    171 //清除整个链表
    172 static void throughtdel (Stus* p) {
    173     Stus* q;
    174     for (q=NULL;p;p=q)
    175     {
    176         q = p->Next;
    177         free(p);
    178     }
    179 }
    180 //对链表进行排序 降序(0) 或者 升序(1)
    181 static void swap(int *a,int *b) {
    182     int m = *a;
    183     *a = *b;
    184     *b = m;
    185 }
    186 //排序
    187 static void order(List* list) {
    188     int g = 0; printf("降序(0)?升序(1) 请输入:");
    189     scanf("%d", &g);
    190     Stus* q, * p, * c; //冒泡排序
    191     c = q = p = NULL;
    192     if (list->head->Next== NULL || list == NULL)
    193     {
    194         return;
    195     }
    196     for (q = list->head; q != NULL; q = q->Next)
    197     {
    198         for (p = list->head; p->Next!= NULL; p = p->Next)
    199         {
    200             if(g){
    201                 if (p->num > p->Next->num) //q  q+1
    202                 {
    203                     swap(&p->Next->num, &p->num);
    204                     swap(&p->Next->name, &p->name);
    205                 }
    206             }else{
    207                 if (p->num < p->Next->num) //q  q+1
    208                 {
    209                     swap(&p->Next->num, &p->num);
    210                     swap(&p->Next->name, &p->name);
    211                 }
    212             }
    213             
    214         }
    215     }
    216     select(list->head);
    217     return;
    218 }
    219 //求最大 域值的位置
    220 static void maxdj(Stus *arr,Stus**s) {
    221     //返回s
    222     Stus* p;
    223     p = arr->Next;
    224     *s = arr;//首位比较
    225     while (p->Next!=NULL)
    226     {
    227         p = p->Next;
    228         if ((*p).num > (*s)->num)*s = p;
    229     }
    230     return;
    231 }
    232 //插入 链表中 添加
    233 static void adds(Stus **arr) {
    234     Stus* stat = (Stus*)malloc(Len);
    235     printf("添加请输入:索引   姓名
    ");
    236     scanf("%d %s", &stat->num, &stat->name);
    237     getchar();
    238     //添加到首位
    239     stat->Next = *arr;
    240     (*arr) = stat;
    241     return;
    242 }
    243 //修改
    244 static void update(Stus** arr) {
    245     int*ins = (int*)malloc(sizeof(int)),c=1;
    246     char*dc= (char*)malloc(sizeof(char));
    247     Stus *p=*arr;
    248     printf("请输入要修改的序号:");
    249     scanf("%d", ins);
    250     while (p!=NULL)
    251     {
    252         if ((*arr)->num==*ins)
    253         {
    254             c = 0;
    255             printf("请输入要修改的值:");
    256             scanf("%s", dc);
    257             strcpy(p->name, dc);
    258             break;
    259         }
    260         p = p->Next;
    261     }
    262     if (c)printf("没有找到您要修改的 数据!
    ");
    263     else    printf("完毕! 输入1查询;
    ");
    264     free(ins);
    265 
    266     return;
    267 }
    268 //全局操作  //说明 :List 的head本身就是指针 所以操作只可以用  Stu** 来操作 
    269 static void operation() {
    270     static void maxdj(Stus * arr, Stus **s);//求最大 域值的位置
    271     static void select(Stus * p);//显示链表
    272     static void dynamictable(List*list);//删除某节点
    273     static void searchs(Stus * p);    //搜索
    274     static void order(Stus * list);
    275     static void del(List * list);//删除2
    276     //降序后插入 链表中
    277     static void adds(Stus * *arr);
    278     //修改
    279     static void update(Stus * *arr);
    280     Stus *s;
    281     int ops = 0,*oop=&ops;
    282     List list;         //链表头声明
    283     list.head = NULL;  //初始化
    284     createtable(&list);//赋值操作  //list就代表了整个链表  ****  nb
    285     printf("请输入操作: 1:查询链表 2:删除某个链表 3:搜索  4.求最大域值 5.排序排列! 6.插入 7:修改 8:删除某链表(输入0结束!)
    ");
    286     scanf("%d", oop);
    287     while (*oop)
    288     {
    289         switch (*oop)
    290         {
    291         case 1: //查询
    292             select(list.head);
    293             break;
    294         case 2: //删除 某节点
    295             dynamictable(&list);
    296             break;
    297         case 3://搜索某节点
    298             searchs(list.head);
    299             break;
    300         case 4://求最大 域值的位置
    301             maxdj(list.head,&s);
    302             printf("最大的域位置和值为: %d %s
    ", (*s).num, (*s).name);
    303             break;
    304         case 5://排序 //对链表进行排序 降序(0) 或者 升序(1)
    305             //对链表进行排序 降序(0) 或者 升序(1)
    306             order(&list);
    307             printf("完毕! 输入1查询;
    ");
    308             break;
    309         case 6://插入节点
    310             adds(&list.head);
    311             printf("完毕! 输入1查询;
    ");
    312             break;
    313         case 7://修改
    314             update(&list.head);
    315             break;
    316         default:
    317             //删除方法二 
    318             del(&list);
    319             printf("完毕! 输入1查询;
    ");
    320             break;
    321         }
    322         printf("请输入操作: 1:查询链表 2:删除某个链表 3:搜索  4.求最大域值 5.排序排列! 6.插入 7:修改 8:删除某链表(输入0结束!)
    ");
    323         scanf("%d", oop);
    324     }
    325     printf("结束操作!
    ");
    326 
    327 }
    332 //动态插入 按照输入索引位置插入 没有找到则插入到最前面
    333 static td(Stus*head) {
    334     Stus* p = head, * q = NULL, * cc = (Stus*)malloc(Len); int oc = 0;
    335     cc->Next = NULL;
    336     //插入操作
    337     printf("请输入插入的数:");
    338     scanf("%d %d", &cc->num, &oc);
    339     cc->Next = NULL;
    340 
    341     while (p->Next != NULL && p->num != oc)
    342     {
    343         q = p;
    344         p = p->Next;
    345     }
    346     if (q == NULL)
    347     {
    348         printf("找到了!在首位");
    349         cc->Next = p->Next;
    350         p->Next = cc;
    351 
    352     }
    353     else {
    354         if (p->num == oc)
    355         {
    356             printf("找到了!");
    357             q->Next = cc;
    358             cc->Next = p;
    359         }
    360      else {
    361             printf("没有找到了!");
    362             p->Next = cc;
    363             cc->Next = NULL;
    364         }
    365     }
    366 
    367     while (head != NULL)
    368     {
    369         printf("%d ", head->num);
    370         head = head->Next;
    371     }
    372 
    373 
    374 }
  • 相关阅读:
    汇编学习笔记(3)[bx]和loop
    C++面试题-概念篇(一)
    命名空间的冷思考
    背包以及装备模块封装的思考
    虚函数,纯虚函数以及虚继承
    组件化开发在游戏开发当中的思考和汇总
    Netty和MINA之间的比较思考
    学习C++与Java之间的区别
    C++服务器年前总结
    C++Builder如何将当前时间与字符串相互转换
  • 原文地址:https://www.cnblogs.com/zonzi/p/13151625.html
Copyright © 2020-2023  润新知