zoukankan      html  css  js  c++  java
  • 数据结构之顺序表和单链表的实现-C语言版

    数据结构之顺序表和单链表的实现-C语言版

    一、顺序表

    1.顺序表的创建

    //Authors:xiaobei
    void CREATE(SqList *L)
       { 
      int i;
         printf("请输入学生的个数:");
         scanf("%d",&L->length);
         for(i=0;i<L->length;i++)
         {  
       printf("第%d个学生信息:
    ",i+1);
       printf("学号:");
       scanf("%d",&L->stu[i].stu_num);
       printf("姓名:");
       scanf("%s",L->stu[i].name);
         }
      printf("OK");
    }

    2.顺序表查找

    //Authors:xiaobei
    void LOCATE(SqList L)
    {     
     int i=0;
     int number;
     printf("
    请输入要查找学生的学号:");  
        scanf("%d",&number);
     while(i<=L.length-1 && L.stu[i].stu_num!=number)
      i++;
     if(i<=L.length-1)
      printf("学生位置为:%d",i+1);
     else 
      printf("学生信息不存在!");
    }

    3.顺序表的插入

    //Authors:xiaobei
    void INSERT(SqList *L)
    {   
     int i,j;
     Data e;
     printf("
    请输入插入位置(1<=n<=%d):",L->length+1);
     scanf("%d",&i);
        if(L->length==MAXSIZE) 
      printf("数据已满!
    ");
        else if 
      (i<1||i>L->length +1)
      printf("输入位置错误!
    ");
        else
     {
      {
       printf("学号:");
       scanf("%d",&e.stu_num);
       printf("姓名:");
       scanf("%s",e.name);
      }
      for(j=L->length-1;j>=i-1;j--)
       L->stu[j+1] = L->stu[j];
       L->stu[i-1] = e;
             L->length++;
     }
     printf("
    OK
    ");
    }

    4.顺序表的删除

    //Authors:xiaobei
    void DELETE(SqList *L)
    {
     int i,j;
     Data elem;
     printf("
    请输入要删除的元素的位置(1<=n<=%d):",L->length);
     scanf("%d",&i);
     if (L->length==0)
      printf("空表!
    ");
     else if(i<1||i>L->length)
      printf("输入位置错误!
    ");
     else
     { 
      elem = L->stu[i-1];
      for(j=i;j<=L->length-1;j++)
               L->stu[j-1] = L->stu[j];
      L->length--;
     }
     printf("OK");
    }

    5.顺序表的显示

    //Authors:xiaobei
    void PRINT(SqList L)
    {
     int i;
     printf("学号		姓名
    ");
     for(i=0;i<L.length;i++)
      printf("%d		%s
    ",L.stu[i].stu_num,L.stu[i].name);
    }

    6.代码补全

    //Authors:xiaobei
    #include<stdio.h>
    #include<stdlib.h>
    #define MAXSIZE 100
    
    struct Data
    {
     char name[10];
     int stu_num;
    };
    
    typedef struct
    { 
     int length;
     Data stu[MAXSIZE];
    }SqList;
    //指定SqList为上述结构体的类型名,与结构体的定义相同
    
    void MENU_PRINT();
    void CREATE(SqList *L);
    void INSERT(SqList *L);
    void PRINT(SqList L);
    void DELETE(SqList *L);
    void LOCATE(SqList L);
    //****************主函数****************
    void main()
    {
     SqList Stu_Data;
        while(1)
     {
      int k;
      MENU_PRINT();
      scanf("%d",&k);
      switch(k)
      {
      case 0:exit(0);break;
      case 1:CREATE(&Stu_Data);break;
      case 2:INSERT(&Stu_Data);break;
            case 3:DELETE(&Stu_Data);break;
            case 4:LOCATE(Stu_Data);break;
      case 5:PRINT(Stu_Data);
        };
     }
    }
    //***********************************
    //打印菜单
    void MENU_PRINT()
    {
     printf("
    ******************
       
    *  1.创建顺序表  *
       
    *  2.插入元素    *
       
    *  3.删除元素    *
       
    *  4.查找元素    *
       
    *  5.显示顺序表  *
       
    *  0.结束程序运行*
       
    * 请输入您的选择 *
       
    ******************
       
    >>>");
    }

    7.运行结果

    在这里插入图片描述

    二、单链表

    1.单链表的初始化和创建

    //Authors:xiaobei
    //单链表的初始化
    void Status_InitList(LinkList L)
    {
     L = (LNode*) malloc(sizeof(LNode));  
     //生成新结点作为头结点,用头指针L指向头结点
     L->next = NULL;
     printf("成功分配存储空间!
    ");
    }
    //单链表的创建
    void CreateList_H(LinkList *Li,int n)
    {
     int i;
     LNode *p = NULL;
     {
      *Li = (LNode*) malloc(sizeof(LNode));
      (*Li)->next = NULL;
      printf("单链表初始化成功!
    ……
    ");
     }
     for(i=n;i>0;i--)
     {
      p = (LNode*) malloc(sizeof(LNode));
      printf("请输入链表元素%d:",i);
      scanf("%d",&p->data);
      p->next = (*Li)->next;
      (*Li)->next = p;
     }
     printf("单链表创建成功!
    ……
    ");
    }

    2.单链表的取值

    //Authors:xiaobei
    void Status_GetElem(LinkList L,int i)
    {
     int j = 1;
     LNode *p;
     p = L->next;
     while(p && j<i)
     {
      p = p->next;
      ++j;
     }
     if(!p || j>i)
      printf("位置有误!
    ");
     else
      printf("取值成功!该值为:%d
    ",p->data);
    }

    3.单链表的查找

    //Authors:xiaobei
    void LocateElem(LinkList L,int e)
    {
     int i = 1;
     LNode *p = NULL;
     p = L->next;
     while(p && p->data!=e)
     { 
      p = p->next;
      i++;
     }
     if(i>4 || p->data!=e)
      printf("元素不存在!
    ");
     else
      printf("该元素位置为:%d
    ",i);
    }

    4.单链表的插入

    //Authors:xiaobei
    void Status_ListInsert(LinkList *Li,int i,int e)
    {
     LinkList s;
     LNode *p = NULL;
     int j;
     p = *Li;
     j = 0;
     while(p && (j<i-1))
     {
      p = p->next;
      ++j;
     }
     if(!p||j>i-1)
      printf("输入位置错误!
    ");
     else
     {
      s = (LNode*) malloc(sizeof(LNode));
      s->data = e;
      s->next = p->next;
      p->next = s;
      printf("元素插入成功!
    ");
     }
    }

    5.单链表的删除

    //Authors:xiaobei
    void Status_ListDelete(LinkList *Li,int i)
    {
     LNode *p = NULL,*q = NULL;
     int j;
     p = *Li;
     j = 0;
     while((p->next) && (j<i-1))
     {
      p = p->next;
      ++j;
     }
     if(!(p->next)||(j>i-1))
      printf("删除位置不合理!
    ");
     else
     {
      q = p->next;
      p->next = q->next;
      free(q);
      printf("删除成功!
    ");
     }
    }

    6.单链表的显示

    //Authors:xiaobei
    void Print_List(LinkList L)
    {
     LNode *p = NULL;
     p = L->next;
     printf("链表元素为:");
     while(p)
     {
      printf("%d,",p->data);
      p = p->next;
     }
     printf("
    ");
    }

    7.代码补全

    //Authors:xiaobei
    #include<stdio.h>
    #include<stdlib.h>
    
    typedef struct LNode
    {
     int data;
     struct LNode *next;
    }LNode,*LinkList;
    
    void Status_InitList(LinkList L);
    void Status_GetElem(LinkList L,int i);
    void LocateElem(LinkList L,int e);
    void Status_ListInsert(LinkList *Li,int i,int e);
    void Status_ListDelete(LinkList *L,int i);
    void CreateList_H(LinkList *Li,int n);   
    //前插法创建,输入顺序和逻辑顺序相反,所以需要逆序输入
    void Print_List(LinkList L);
    int Link_Length(LinkList L);
    void Print_Menu();
    
    void main()
    {
     int i,n = 4,e,user;
     LinkList L = NULL;
     LinkList *Li = &L;
     CreateList_H(Li,n);
     while(1)
     {
      Print_Menu();
      scanf("%d",&user);
      if(user>5 || user<0)
       printf("输入选项有误!");
      else 
       switch(user)
      {
       case 1:{
        printf("请输入取值位置(0-4):");
        scanf("%d",&i);
        Status_GetElem(L,i);
        break;
           }
       case 2:{
        printf("请输入要查找的元素:");
        scanf("%d",&e);
        LocateElem(L,e);
        break;
           }
       case 3:{
        printf("请输入要插入的元素:");
        scanf("%d",&e);
        printf("请输入要插入的位置(1-%d):",Link_Length(L)+1);
        scanf("%d",&i);
        Status_ListInsert(Li,i,e);
        break;
           }
       case 4:{
        printf("请输入要删除的元素位置(1-%d):",Link_Length(L));
        scanf("%d",&i);
        Status_ListDelete(Li,i);
        break;
           }
       case 5:Print_List(L);break;
       case 0:exit(0);
      };
     }
    }
    
    void Print_Menu()
    {
     printf("
    **********************
      
     1.单链表取值
      
     2.单链表查找
      
     3.单链表插入
      
     4.单链表删除
      
     5.显示单链表
      
     0.退出
      n(请输入序号0-5)
      
    **********************
      
    >>>");
    }
    
    //找到链表长度
    int Link_Length(LinkList L)
    {
     int i = 0;
     LNode *p = NULL;
     p = L->next;
     while(p)
     {
      p = p->next;
      i++;
     }
     return i;
    }

    8.运行结果

    在这里插入图片描述

  • 相关阅读:
    初识python: 斐波拉契数(生成器获取)
    初识python:斐波拉契数(列表获取)
    初识python: 递归函数
    初识python:多线程
    初识python 之 取101到200之前的所有素数
    初识python 之 兔子生崽(小练习)
    初识python 之 MongoDB 基本操作
    初识python 之 mysql数据库基本操作
    MongoDB 安装及制作成windows服务
    初识python: 回调函数
  • 原文地址:https://www.cnblogs.com/slz99/p/12527752.html
Copyright © 2011-2022 走看看