数据结构第一天、线性表的顺序表示与实现
今天心血来潮,突然想重新复习一遍数据结构并将其中的所有内容用C实现一遍。也算是为考研做点准备吧。今天是第一天,先将线性表的顺序表示实现了。
在对算法的复习过程中没有产生太大的问题,插入、删除和查找的操作时间复杂度都是O(n)。因为假设两个线性表是已经排好序的,所以将两个线性表合成一个线性表的操作也是O(n)量级的。
在写代码时却碰见了几个问题,首先是结构体变量赋值的问题。一起来看下面的代码:
#include <stdio.h> typedef struct Test { int test1[10]; int test2; } Demo; int main() { Demo demo; demo.test2 = 5; for (int i = 0; i < 5; i++) { demo.test1[i] = i + 1; } for (int i =0; i < 5; i++) { printf("%d ", demo.test1[i]); } printf("\n"); Demo demo2 = { {1,2,3,4,7}, 4 }; for (int i =0; i < 5; i++) { printf("%d ", demo2.test1[i]); } printf("\n"); }
可以看出比较普遍的有两种方式来给结构体变量赋值,一种是较为简单的一次赋值,另一种是先声明后再逐个结构项进行赋值。
解决了这个问题后,就顺利多了,下面贴代码:
1 #include <stdio.h> 2 #include <stdlib.h> 3 #define MAXSIZE 100 4 5 typedef struct { 6 int Data[MAXSIZE]; 7 int Last; 8 } List; 9 10 //List L, *PtrL; 11 12 //初始化,建立空的顺序表 13 List *MakeEmpty() 14 { 15 List *PtrL; 16 PtrL = (List *)malloc(sizeof(List)); 17 PtrL->Last = -1; 18 return PtrL; 19 } 20 21 //查找 22 int Find(int X, List *PtrL) 23 { 24 int i = 0; 25 while (i <= PtrL->Last && PtrL->Data[i] != X) { 26 i++; 27 } 28 if (i > PtrL->Last) 29 { 30 return -1; 31 } else { 32 return i; 33 } 34 } 35 36 //插入 37 void Insert(int X, int i, List *PtrL) 38 { 39 int j; 40 if (PtrL->Last == MAXSIZE - 1) 41 { 42 printf("表满\n"); 43 return; 44 } 45 if (i < 1 || i > PtrL->Last + 2) 46 { 47 printf("位置不合法\n"); 48 return; 49 } 50 for (j = PtrL->Last; j >= i-1; j--) 51 { 52 PtrL->Data[j+1] = PtrL->Data[j]; 53 } 54 PtrL->Data[i-1] = X; 55 PtrL->Last++; 56 return; 57 } 58 59 60 //删除 61 void Delete(int i, List *PtrL) 62 { 63 int j; 64 if (i < 1 || i > PtrL->Last + 1) 65 { 66 printf("没有此元素\n"); 67 return; 68 } 69 for (j = i; j <= PtrL->Last; j++) 70 { 71 PtrL->Data[j-1] = PtrL->Data[j]; 72 } 73 PtrL->Last--; 74 return; 75 } 76 77 78 //遍历 79 void Traverse(List *PtrL) 80 { 81 for (int i = 0; i < PtrL->Last; ++i) 82 { 83 printf("%d ", PtrL->Data[i]); 84 } 85 printf("\n"); 86 } 87 88 89 //将已知顺序表La和Lb的元素按值非递减排列 90 void MergeList(List La, List Lb, List Lc) 91 { 92 //int length = (La.Last >= Lb.Last) ? Lb.Last : La.Last; 93 int pa = 0; 94 int pb = 0; 95 int pc = 0; 96 while (pa < La.Last && pb < Lb.Last) { 97 if (La.Data[pa] <= Lb.Data[pb]) 98 { 99 Lc.Data[pc++] = La.Data[pa++]; 100 } else { 101 Lc.Data[pc++] = Lb.Data[pb++]; 102 } 103 } 104 while (pa < La.Last) 105 Lc.Data[pc++] = La.Data[pa++]; 106 while (pb < Lb.Last) 107 Lc.Data[pc++] = Lb.Data[pb++]; 108 } 109 110 List MergeList1(List La, List Lb) 111 { 112 //int length = (La.Last >= Lb.Last) ? Lb.Last : La.Last; 113 int length = La.Last + Lb.Last; 114 List Lc; 115 Lc.Last = length; 116 int pa = 0; 117 int pb = 0; 118 int pc = 0; 119 while (pa < La.Last && pb < Lb.Last) { 120 if (La.Data[pa] <= Lb.Data[pb]) 121 { 122 Lc.Data[pc++] = La.Data[pa++]; 123 } else { 124 Lc.Data[pc++] = Lb.Data[pb++]; 125 } 126 } 127 while (pa < La.Last) 128 Lc.Data[pc++] = La.Data[pa++]; 129 while (pb < Lb.Last) 130 Lc.Data[pc++] = Lb.Data[pb++]; 131 return Lc; 132 } 133 134 135 136 int main(int argc, char const *argv[]) 137 { 138 /* 139 List L = { 140 {11, 2, 4, 5, 6}, 141 5 142 }; 143 */ 144 145 List *PtrL = MakeEmpty(); 146 for (int i = 1; i < 20; ++i) 147 { 148 int e = i + 1; 149 Insert(e, i, PtrL); 150 } 151 //scanf("%d\n", &PtrL->Last); 152 153 /* 154 for (int i = 0; i < PtrL->Last; ++i) 155 { 156 scanf("%d", &PtrL->Data[i]); 157 } 158 */ 159 160 //PtrL->Last = 5; 161 //PtrL->Data{1, 2, 4, 5, 6}; 162 163 int findNum = Find(0, PtrL); 164 printf("%d\n", findNum); 165 166 Insert(30, 2, PtrL); 167 Traverse(PtrL); 168 Delete(2,PtrL); 169 Traverse(PtrL); 170 171 //测试MergeList函数 172 List la = { 173 {2, 3, 4, 7, 8}, 174 5 175 }; 176 List lb = { 177 {1, 2, 4, }, 178 4 179 }; 180 181 /* 182 List lc = { 183 {0, 0, 0, 0, 0, 0, 0, 0, 0}, 184 9 185 }; 186 */ 187 188 //MergeList(la, lb, lc); 189 List lc = MergeList1(la, lb); 190 Traverse(&la); 191 Traverse(&lb); 192 Traverse(&lc); 193 return 0; 194 }

浙公网安备 33010602011771号