数据结构 实验一 线性表

数据结构 实验一 线性表

首先是头文件“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文件:
里面还有线性表的链式存储结构的相关代码,有兴趣的同学可以看一看。
原文地址:https://www.cnblogs.com/uppercloud/p/DataStructure_SqList.html