• 数据结构 实验一 线性表


    数据结构 实验一 线性表

    首先是头文件“DataHead”的代码:

     1 /*  Data_Structure.h -- 数据结构书p10页,预定义常量和类型 */
     2 
     3 #define TRUE   1
     4 #define FALSE  0
     5 #define OK     1
     6 #define ERROR  0
     7 #define INFEASIBLE -1 /* infeasible    */
     8 #define OVERFLOW   -2
     9 
    10 typedef int Status;

    给出顺序线性表的实验代码:

      1 #include <stdio.h>
      2 #include <stdlib.h>
      3 
      4 #include "DataHead.h"
      5 
      6 typedef int Status;
      7 
      8 /*定义线性表内的元素类型为整数类型*/
      9 typedef int ElemType;
     10 
     11 /*线性表的动态分配顺序存储结构*/
     12 #define LIST_INIT_SIZE 100
     13 #define LISTINCREMENT 10
     14 typedef struct{
     15     ElemType *elem;
     16     int      length;
     17     int      listsize;
     18 }SqList;
     19 
     20 /*函数申明*/
     21 Status InitList_Sq(SqList *L);   /*  算法2.3 */
     22 void Out_List(SqList L);    /*补充,输出打印线性表*/
     23 Status ListInsert_Sq(SqList *pL, int i, ElemType e);   /*  算法2.4 */
     24 Status ListDelete_Sq(SqList *L, int i, ElemType *e);   /*  算法2.5 */
     25 Status compare(ElemType a, ElemType b);
     26 int LocateElem_Sq(SqList L, ElemType e, Status (*compare)(ElemType, ElemType));   /*  算法2.6 */
     27 
     28 
     29 
     30 /*主函数*/
     31 void main()
     32 {
     33  int i,k,loc;     /* k ,菜单控制变量*/
     34  ElemType e;
     35  ElemType x;
     36  char ch;
     37  SqList L;
     38  SqList *p;
     39  system("graftabl 936");/*调用MS_DOS中文支持*/
     40  p=&L;/*p指向 L*/
     41  do{
     42 
     43     printf("
    
    
    ========实验一:线性表 ===============");
     44     printf("
            1.建立线性表");
     45     printf("
            2.插入元素");
     46     printf("
            3.删除元素");
     47     printf("
            4.查找元素");
     48     printf("
            0.结束程序运行");
     49     printf("
    =====================================");
     50     printf("
            请输入您的选择(1,2,3,4,0)
    ");
     51 
     52     scanf("%d",&k);
     53     switch(k)
     54     {
     55      case 1:{loc=InitList_Sq(p);
     56             printf("
    请输入线性表元素个数,并依次输入整数类型的元素值");
     57             scanf("%d",&loc);
     58             for(i=1;i<=loc;i++) {
     59                scanf("%d",&e);
     60                ListInsert_Sq(p, i, e);  /*也可以不处理函数返回值*/
     61                }
     62             Out_List(L);
     63             }break;
     64      case 2:{ printf("
    请输入插入位置  及  整数类型的元素值");
     65             scanf("%d%d",&loc,&e);
     66             ListInsert_Sq(p, loc, e);
     67             Out_List(L);
     68             }break;
     69      case 3:{ printf("
    请输入删除的元素位置");
     70               scanf("%d",&i);
     71               ListDelete_Sq(p, i, &e);
     72               Out_List(L);
     73              }break;
     74      case 4:{
     75               printf("
    请输入要查找的元素的值:");
     76               scanf("%d",&e);
     77               int result = LocateElem_Sq(L, e, compare);
     78               printf("
    查找的元素在线性表的第 %d 位", result);
     79              }break;
     80      case 0:{ exit(0);}
     81     }
     82   }while(k!=0);
     83   printf("
           按回车键,返回…
    ");
     84   ch =getchar();
     85 }
     86 
     87 
     88 
     89 
     90 Status InitList_Sq(SqList *L) {  /*  算法2.3 */
     91   /*  构造一个空的线性表L。 */
     92   L->elem = (ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
     93   if (!L->elem) exit(OVERFLOW);        /*  存储分配失败 */
     94   L->length = 0;                  /*  空表长度为0 */
     95   L->listsize = LIST_INIT_SIZE;   /*  初始存储容量 */
     96   return OK;
     97 } /*  InitList_Sq */
     98  
     99 Status ListInsert_Sq(SqList *L, int i, ElemType e) {  /*  算法2.4 */
    100   /*  在顺序线性表L的第i个元素之前插入新的元素e, */
    101   /*  i的合法值为1≤i≤ListLength_Sq(L)+1 */
    102   ElemType *p,*q;
    103   if (i < 1 || i > L->length+1) return ERROR;  /*  i值不合法 */
    104   if (L->length >= L->listsize) {   /*  当前存储空间已满,增加容量 */
    105     ElemType *newbase = (ElemType *)realloc(L->elem,
    106                   (L->listsize+LISTINCREMENT)*sizeof (ElemType));
    107     if (!newbase) return ERROR;   /*  存储分配失败 */
    108     L->elem = newbase;             /*  新基址 */
    109     L->listsize += LISTINCREMENT;  /*  增加存储容量 */
    110   }
    111   q = &(L->elem[i-1]);   /*  q为插入位置 */
    112   for (p = &(L->elem[L->length-1]); p>=q; --p) *(p+1) = *p;
    113                                   /*  插入位置及之后的元素右移 */
    114   *q = e;       /*  插入e */
    115   ++L->length;   /*  表长增1 */
    116   return OK;
    117 } /*  ListInsert_Sq */
    118 
    119 
    120 void Out_List(SqList L){
    121     int i;
    122     printf("
    当前线性表为:");
    123     for(i=0; i<L.length;i++) printf("%10d",L.elem[i]);
    124 }
    125 
    126 Status ListDelete_Sq(SqList *L, int i, ElemType *e) {  /*  算法2.5 */
    127   /*  在顺序线性表L中删除第i个元素,并用e返回其值。 */
    128   /*  i的合法值为1≤i≤ListLength_Sq(L)。 */
    129   ElemType *p, *q;
    130   if (i<1 || i>L->length) return ERROR;  /*  i值不合法 */
    131   p = &(L->elem[i-1]);                   /*  p为被删除元素的位置 */
    132   *e = *p;                               /*  被删除元素的值赋给e */
    133   q = L->elem+L->length-1;               /*  表尾元素的位置 */
    134   for (++p; p<=q; ++p) *(p-1) = *p;      /*  被删除元素之后的元素左移 */
    135   --L->length;                           /*  表长减1 */
    136   return OK;
    137 } /*  ListDelete_Sq */
    138 
    139 int LocateElem_Sq(SqList L, ElemType e,
    140         Status (*compare)(ElemType, ElemType)) {  /*  算法2.6 */
    141   /*  在顺序线性表L中查找第1个值与e满足compare()的元素的位序。 */
    142   /*  若找到,则返回其在L中的位序,否则返回0。 */
    143   int i;
    144   ElemType *p;
    145   i = 1;        /*  i的初值为第1个元素的位序 */
    146   p = L.elem;   /*  p的初值为第1个元素的存储位置 */
    147   while (i <= L.length && !(*compare)(*p++, e)) 
    148     ++i;
    149   if (i <= L.length) return i;
    150   else return 0;
    151 } /*  LocateElem_Sq */
    152 
    153 Status compare(ElemType a, ElemType b)
    154 {
    155     if(a == b)
    156         return 1;
    157     else
    158         return 0;
    159 }
    可以复制上述代码,也可以去我的网盘下载该cpp文件:
    里面还有线性表的链式存储结构的相关代码,有兴趣的同学可以看一看。
  • 相关阅读:
    第二章:(2)Dubbo 常用配置之 启动时检查
    第二章:(1)Dubbo 配置
    2019版:第三章:(6)Redis 五大数据类型 之 ZSet
    2019版:第三章:(1)Redis 五大数据类型与 key
    2019版:第三章:(2)Redis 五大数据类型 之 String
    2019版:第四章:Redis 的配置文件
    2019版:第三章:(5)Redis 五大数据类型 之 Hash
    adm部署的k8s 修改端口范围(默认为3000032767)
    Android开发日记1
    Activity 利用Intent 转换到另一个Activity
  • 原文地址:https://www.cnblogs.com/uppercloud/p/DataStructure_SqList.html
Copyright © 2020-2023  润新知