1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define N 64 //宏定义 5 typedef int datatype; 6 //线性表的结构体定义,连续存储空间,last用于表明最后一个数据元素的存储元素 7 typedef struct list 8 { 9 //线性表是一个连续存储空间,用数组表示 10 datatype data[N]; 11 //连续存储空间,last用于表明最后一个数据元素的存储元素 12 int last; 13 }sqlist;//tyedef关键字表示 sqlist替代 struct sqlist 14 //给线性结构分配空间 15 sqlist * creat_list(); 16 //为线性结构插入元素(在线性空间的最后一个元素之后插入) 17 int insert_list(sqlist * L,datatype value);//函数第一个形参需传入结构体指针,第二个形参传入的是插入的元素值 18 //判断线性结构是否满 19 int full_list(sqlist * L); 20 //打印输出线性结构内容 21 void show_list(sqlist * L); 22 //删除线性结构元素,删除线性空间最后一个元素 23 int del_list(sqlist * L); 24 //判断线性结构是否为空 25 int empty_list(sqlist * L); 26 //向线性结构按位置插入元素 需传入的参数为 构造体,插入位置,插入元素值 27 int add_pos_list(sqlist * L ,int pos,datatype value); 28 //删除指定位置元素 29 int del_pos_list(sqlist * L,int pos); 30 //根据数值更改数据元素 31 int change_bynum(sqlist * L,datatype old,datatype new); 32 //查找元素 33 int find_list(sqlist * L, datatype value); 34 //查找元素,删除重复项,比如输入1234554321,执行此函数之后是12345 35 void purge_list(sqlist *L); 36 void unio_list(sqlist *L1,sqlist *L2); 37 //L1和L2两个线性表,将两个线性表拼接在一起,比如L1:12345, 38 //L2:345678,执行函数结果为L1:12345678, L2:345678 39 int main(int argc, const char *argv[]) 40 { 41 //定义sqlist结构体指针,并将由creat_list()开辟的内存空间首地址赋值给指针L 42 sqlist * L1 = creat_list(); 43 sqlist * L2 = creat_list(); 44 //判断是否成功调用creat_list() 45 if((L1=creat_list()) == NULL) 46 { 47 printf("函数调用失败"); 48 //如果满足判断条件,表示creat_list()调用失败,返回值为-1,函数结束 49 return -1; 50 } 51 if((L2=creat_list()) == NULL) 52 { 53 printf("函数调用失败"); 54 //如果满足判断条件,表示creat_list()调用失败,返回值为-1,函数结束 55 return -1; 56 } 57 insert_list(L1,1); 58 insert_list(L1,2); 59 insert_list(L1,3); 60 insert_list(L1,4); 61 insert_list(L1,5); 62 insert_list(L1,7); 63 insert_list(L1,8); 64 insert_list(L2,1); 65 insert_list(L2,3); 66 insert_list(L2,4); 67 insert_list(L2,5); 68 insert_list(L2,9); 69 insert_list(L2,2); 70 insert_list(L2,8); 71 unio_list(L1,L2); 72 show_list(L1); 73 show_list(L2); 74 free(L1); 75 free(L2); 76 return 0; 77 } 78 79 //给线性结构分配空间 80 sqlist * creat_list() 81 { 82 sqlist * L = NULL; 83 //sizeof表示结构体所占用的字节数,malloc该函数分配了的字节数,并返回了指向这块内存的指针。如果分配失败,则返回一个空指针(NULL) 84 L = (sqlist *)malloc(sizeof(sqlist)); 85 //如果分配空间失败,返回以下内容 86 if (NULL == L) 87 { 88 printf("空间创建失败\n"); 89 return NULL; 90 } 91 L->last = -1; 92 //需要返回值类型为结构体指针 93 return L; 94 } 95 96 //为线性结构插入元素 97 int insert_list(sqlist * L,datatype value) 98 { 99 //判断线性体元素是否已满 100 if(full_list(L)) 101 { 102 printf("线性结构已存满\n"); 103 insert_list(L,1); 104 return -1; 105 } 106 //L->last表示结构体中的last的值 107 L->data[L->last+1]=value; 108 //连续存储空间,last用于表明最后一个数据元素的存储元素 109 L->last++; 110 return 0; 111 } 112 //判断线性表是否满 113 int full_list(sqlist * L) 114 { 115 //last从0开始,需要<N-1,当等于N-1时表示表空间已满 116 return L->last==N-1?1:0; 117 } 118 119 //打印输出线性结构内容 120 void show_list(sqlist * L) 121 { 122 int i; 123 //遍历结构体 124 for(i = 0; i <= L->last; i++) 125 { 126 printf("%d ",L->data[i]); 127 } 128 printf("\n"); 129 } 130 131 //删除线性结构元素 132 int del_list(sqlist * L) 133 { 134 //判断线性表是否满 135 if(empty_list(L)) 136 { 137 printf("线性空间已空,没有元素"); 138 return -1; 139 } 140 if(empty_list(L)) 141 L->last--; 142 return 0; 143 } 144 145 //判断线性结构是否为空 146 int empty_list(sqlist * L) 147 { 148 return L->last == -1 ?1:0; 149 } 150 151 //向线性结构按位置插入元素 152 int add_pos_list(sqlist * L ,int pos,datatype value) 153 { 154 int i; 155 if(full_list(L)) 156 { 157 printf("线性结构已存满\n"); 158 return -1; 159 } 160 if(pos < 0||pos > L->last+1) 161 {//判断如果所查找位置已超出线性表空间,注意在last+1(即在最后一个元素之后插入也满足线性表) 162 printf("超出范围,插入失败\n"); 163 return -1; 164 } 165 for(i = L->last+1; i > pos; i--) 166 { 167 L->data[i] = L->data[i-1]; 168 } 169 L->data[pos] = value; 170 L->last++; 171 return 0; 172 } 173 174 //删除指定位置元素 175 int del_pos_list(sqlist * L,int pos) 176 { 177 int i; 178 //判断线性表是否为空 179 if(empty_list(L)) 180 { 181 printf("线性空间为空,无法删除\n"); 182 return -1; 183 } 184 if(pos < 0 || pos >L->last) 185 { 186 printf("超出范围,无法删除\n"); 187 return -1; 188 } 189 for(i = pos; i < L->last; i++) 190 { 191 L->data[i] = L->data[i+1]; 192 } 193 L->last--; 194 return 0; 195 } 196 197 198 //根据数值更改数据元素,根据特定值进行替换 199 int change_bynum(sqlist * L,datatype old, datatype new) 200 { 201 int i; 202 for(i = 0; i <= L->last;i++) 203 { 204 if(old == L->data[i]) 205 { 206 L->data[i] = new; 207 } 208 } 209 return 0; 210 } 211 212 213 //查找元素,根据特定值 214 int find_list(sqlist * L, datatype value) 215 { 216 int i; 217 for(i = 0; i <= L->last;i++) 218 { 219 if(L->data[i] == value) 220 return 1; 221 } 222 return 0; 223 } 224 //查找元素,删除重复项,比如输入1234554321,执行此函数之后是12345 225 void purge_list(sqlist *L) 226 { 227 int i,j; 228 for(i = 0; i < L->last; i++) 229 { 230 for(j = i + 1; j <=L->last; j++) 231 { 232 if(L->data[i] == L->data[j]) 233 { 234 del_pos_list(L,j); 235 j--; 236 } 237 } 238 } 239 } 240 241 242 //L2:345678,执行函数结果为L1:12345678, L2:345678 243 //L1和L2两个线性表,将两个线性表拼接在一起,比如L1:12345, 244 void unio_list(sqlist *L1,sqlist *L2) 245 { 246 int i,j; 247 for(i = 0; i <= L2->last; i++) 248 { 249 if(find_list(L1,L2->data[i]) == 0) 250 { 251 insert_list(L1,L2->data[i]); 252 } 253 } 254 }