//线性顺序表的简单实现
// 在这里要说的是代码讲究的是随机应变,,写代码讲究的是随意二字,
// 一种需求你也许有几十种的办法实现,对代码要理解,,随性,,,,,
#include <cstdio>
#include <cstdlib>
//#define _OJ_
#define initlist_size 100
#define increament 10
typedef struct Lnode
{
int *elem;
int List_size;//当前分配的存储容量
int length;
}List;
void
init_List(List *L)
//创建一个顺序表
{
L->elem = (int*) malloc (initlist_size * sizeof(int));
L->length = 0;
L->List_size = initlist_size;
}
void
inputlist(List *L, int n)
{
int i;
for(i = 0;i < n; i++) {
scanf("%d", &L->elem[i]);
}
L->length = n;
}
int
list_length(List *L)
{
return L->length;
}
void
List_delete(List *L, int i)
//删除第i个元素
{
int j;
if((i >= 1) || i <= L->length)
{
for(j = i - 1;j < L->length; j++)
L->elem[j] = L->elem[j + 1];
}
--L->length;
}
void
List_delete(List *L, int i)
//删除第i个元素
{
int *p, *q;
if((i >= 1) || i <= L->length)
{
p = &(L->elem[i - 1]);
q = L->elem + L->length - 1;
for(p;p <= q; p++)
*p = *(p + 1);
}
--L->length;
//删除的第二个版本,依个人之鄙见,严奶奶的书中这种写法不好,
// 顺序表与链表的区别就是指针,,而这种写法用了大量指针,,
// 不能与之明显的比较
}
void
List_insert(List *L, int i, int x)
//在第I个元素后插入元素x
{
int j;
if(i <= L->length)
{
for(j = L->length - 1;j >= i; j--)
L->elem[j + 1] = L->elem[j];
L->elem[i] = x;
}
++L->length;
}
void
List_insert(List *L, int i, int x)
//在第I个元素后插入元素x
{
int *newbase;
int *p, *q;
if(L->length >= initlist_size)
{
newbase =
(int*) realloc (L->elem, (initlist_size + increament) * sizeof(int));
L->elem = newbase;
L->length = initlist_size + increament;
}
if(i <= L->length)
{
p = &(L->elem[i]);
q = L->elem + L->length - 1;
for(q;q >= p; q--)
*(q + 1) = *q;
*p = x;
}
++L->length;
//插入的第二个版本,依个人之鄙见,严奶奶的书中这种写法不好,
// 顺序表与链表的区别就是指针,,而这种写法用了大量指针,,
// 不能与之明显的比较
}
void
List_union(List *La, List *Lb, List *Lc)
//实现顺序表的合并
{
int i = 0, j = 0, k = 0;
Lc->length = La->length + Lb->length;
while(i < La->length && j < Lb->length)
{
if(La->elem[i] <= Lb->elem[j])
{Lc->elem[k] = La->elem[i]; i++; k++;}
else{
Lc->elem[k] = La->elem[j]; j++; k++;
}
}
while (i < La->length) {
Lc->elem[k] = La->elem[i]; i++; k++;
}
while (j < Lb->length) {
Lc->elem[k] = Lb->elem[j]; j++; k++;
}
}
void
outputlist(List *L)
{
int i;
for(i = 0;i < L->length; i++) {
printf("第%d个元素%d\n", i + 1, L->elem[i]);
}
}
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int n;
List L;
List La;
List Lb, Lc;
scanf("%d", &n);
init_List(L);
inputlist(L,n);
outputlist(L);
printf("长度为length == %d\n", list_length(L));
List_delete(L,1);
outputlist(L);
printf("长度为length == %d\n", list_length(L));
List_insert(L,1,4);
outputlist(L);
printf("长度为length == %d\n", list_length(L));*/
init_List(&La);
inputlist(&La,n);
outputlist(&La);
init_List(&Lb);inputlist(&Lb,n);outputlist(&Lb);
init_List(&Lc);
printf("长度为length == %d\n", list_length(&La));
printf("长度为length == %d\n", list_length(&Lb));
List_union(&La,&Lb,&Lc);
outputlist(&Lc);
List_union(La,Lb,Lc);
printf("长度为length == %d\n", list_length(Lc));
outputlist(Lc);
return 0;
}
但是在实现合并两个表的时候,发现用List *la,*lb,*lc;
init_list(La) init_list(Lb)
不可以申请两个表,就算是申请最后两个表就变成一样的了。。。。