• 链表的基本运算 --线性表


    C语言实现链表的插入、删除、查找运算

      1 /*
      2  *实现链表的插入、删除、查找运算
      3  */
      4 #include <stdio.h>
      5 #include <stdlib.h>
      6 #include <malloc.h>
      7 
      8 #define flag 0
      9 typedef int ElemType;
     10 
     11 typedef struct Lnode    //链式存储结构定义
     12 {
     13     int data;            //定义数据域
     14     struct Lnode *next;          //定义指针域
     15 }Lnode,*LinkList;      //定义结点和头指针类型名
     16 
     17 Lnode *Get_LinkList(LinkList L,int i)
     18 {        //在带头结点单链表中查找第i个数据元素,找到返回其指针,否则返回空
     19     Lnode *p = L;
     20     int j=0;
     21     while(p != NULL  &&  j < i)
     22     {
     23         p = p->next;
     24         j++;
     25     }
     26     return p;
     27 }
     28 
     29 int Locate_LinkList(LinkList L,int x)
     30 {        //在带头结点单链表中查找值等于给定值的结点
     31     LinkList p;
     32     int j = 1;
     33     p = L->next;
     34     while (p != NULL  &&  p->data != x)
     35     {            //若首结点不是查找结点且可以链接刀下一结点
     36         p = p->next;
     37         j++;
     38     }
     39     if(p)
     40     {
     41         printf("%d在链表中,是第%d个元素。
    ",p->data,j);
     42         return j;
     43     }
     44     else
     45     {
     46         printf("该数值不在链表中。
    ");
     47         return 0;
     48     }
     49 }
     50 
     51 int Insert_LinkList(LinkList &L, int i, int x)
     52 {        //在带头结点单链表的第i个位置之后插入值为x的元素
     53     Lnode *p,*s;
     54     p = Get_LinkList(L,i);        //查找第i个元素
     55     if (p == NULL)
     56     {
     57         printf("参数i输入有误
    ");
     58         return 0;
     59     }
     60     else
     61     {
     62         s = (Lnode *)malloc(sizeof(Lnode));        //申请、填充结点
     63         s->data = x;
     64         s->next = p->next;            //新结点插入在第i个结点的后面
     65         p->next = s;
     66         return 1;
     67     }
     68 }
     69 
     70 int Delete_LinkList(LinkList L,int i)
     71 {        //删除带头结点单链表上的第i个数据结点
     72     LinkList p,s;
     73     p = Get_LinkList(L,i-1);        //查找第i-1个结点
     74     if (p == NULL)
     75     {
     76         printf("待删除结点前结点不存在!
    ");
     77         return -1;
     78     }
     79     else if (p->next == NULL)
     80     {
     81         printf("该节点不存在!
    ");
     82         return 0;
     83     }
     84     else
     85     {
     86         s = p->next;            //s指向第i个结点
     87         p->next = s->next;        //从链表中删除
     88         free(s);                //释放s
     89         return 1;
     90     }
     91 }
     92 
     93 void Create_LinkList(LinkList &L, int n)
     94 {        //前插法创建带头结点单链表
     95     int i;
     96     LinkList p;
     97     L = (LinkList)malloc(sizeof(Lnode));
     98     L->next = NULL;            //生成头结点
     99     for (i = n; i > 0; --i)
    100     {
    101         p = (LinkList)malloc(sizeof(Lnode));     //生成新结点
    102         p->data = i;            //填充数据
    103         p->next = L->next;        //将*p插入原开始结点之前,头结点之后
    104         L->next = p;
    105     }
    106 }
    107 
    108 void Display_LinkList(LinkList L)
    109 {
    110     LinkList p;
    111     p = L;
    112     while(p->next)
    113     {
    114         printf("%d ",p->next->data);
    115         p = p->next;
    116     }
    117 }
    118 
    119 int main()
    120 {
    121     printf("初始化
    建立单链表如下: 
    ");
    122     LinkList L;
    123     int x,y,cord,i;
    124     Create_LinkList(L,10);
    125     Display_LinkList(L);
    126     do
    127     {
    128         printf("
                         主菜单                    
    ");
    129         printf("
                 1     尾插法插入元素到指定位置    
    ");
    130         printf("
                 2    删除某一指定元素��        
    ");
    131         printf("
                 3    查找指定元素                
    ");
    132         printf("
                 0    结束程序                    
    ");
    133         printf("----------------------------------------------
    ");
    134         printf("请输入你选择的菜单号<1,2,3,0>: ");
    135         scanf("%d",&cord);
    136         switch(cord)
    137         {
    138             case 1:
    139                 printf("请输入插入元素位置前序号 i: ");
    140                 scanf("%d",&x);
    141                 printf("请输入插入的数据 y: ");
    142                 scanf("%d",&y);
    143                 Insert_LinkList(L,x,y);            //在第i个结点后插入
    144                 printf("单链表输出如下:
    ");
    145                 Display_LinkList(L);
    146                 break;
    147             case 2:
    148                 printf("请输入删除元素序号 x: ");
    149                 scanf("%d",&x);
    150                 Delete_LinkList(L,x);
    151                 printf("单链表输出如下:
    ");
    152                 Display_LinkList(L);
    153                 break;
    154             case 3:
    155                 printf("请输入查找元素值x :");
    156                 scanf("%d",&x);
    157                 i = Locate_LinkList(L,x);
    158                 break;
    159             case 0:
    160                 exit(0);
    161                 break;
    162             default:
    163                 printf("输入有误!");
    164         }
    165     }
    166     while(cord <= 3 && cord >= 0);
    167 }

    运行结果截图

    很想高飞,但我不能;不想天空,剩我一人。
  • 相关阅读:
    【2012百度之星资格赛】G:聊天就是Repeat
    使用testNG进行并发性能测试
    关于处理高并发,防止库存超卖的问题
    关于java内存溢出的异常处理
    关于微服务架构
    关于MySQL绿色版的安装
    G点营销看来也不是@z营销的专利啊
    matlab+中文字体设计,有搞头没有? 有搞头
    字王字型系列命名草案
    国外字体设计师也是蛮重视数学的
  • 原文地址:https://www.cnblogs.com/lixiansheng/p/7678572.html
Copyright © 2020-2023  润新知