线性表的实现

 

  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 }

 

posted on 2019-04-17 16:42  骉赑  阅读(240)  评论(0编辑  收藏  举报

导航