数据结构 实验一 线性表
数据结构 实验一 线性表
首先是头文件“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("\n\n\n========实验一:线性表 ==============="); 44 printf("\n 1.建立线性表"); 45 printf("\n 2.插入元素"); 46 printf("\n 3.删除元素"); 47 printf("\n 4.查找元素"); 48 printf("\n 0.结束程序运行"); 49 printf("\n====================================="); 50 printf("\n 请输入您的选择(1,2,3,4,0)\n"); 51 52 scanf("%d",&k); 53 switch(k) 54 { 55 case 1:{loc=InitList_Sq(p); 56 printf("\n请输入线性表元素个数,并依次输入整数类型的元素值"); 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("\n请输入插入位置 及 整数类型的元素值"); 65 scanf("%d%d",&loc,&e); 66 ListInsert_Sq(p, loc, e); 67 Out_List(L); 68 }break; 69 case 3:{ printf("\n请输入删除的元素位置"); 70 scanf("%d",&i); 71 ListDelete_Sq(p, i, &e); 72 Out_List(L); 73 }break; 74 case 4:{ 75 printf("\n请输入要查找的元素的值:"); 76 scanf("%d",&e); 77 int result = LocateElem_Sq(L, e, compare); 78 printf("\n查找的元素在线性表的第 %d 位", result); 79 }break; 80 case 0:{ exit(0);} 81 } 82 }while(k!=0); 83 printf("\n 按回车键,返回…\n"); 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("\n当前线性表为:"); 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文件:
里面还有线性表的链式存储结构的相关代码,有兴趣的同学可以看一看。