数据结构C语言版.线性表的动态分配顺序存储结构表示和实现文库 下载本文

if(e <= *((*L).elem+j)) break;

// 将e插表中的第j+1个位置 ListInsert(L, j+1, e); }

return 1; }

// 按非升序建立n个元素的线性表。 int CreatDescend(SqList *L, int n) {

int i,

j; //记录数据要插入的位置 ElemType e;

InitList(L);

printf(\请输入%d个元素:\\n\ scanf(\

ListInsert(L, 1, e); // 在空表中插入第1个元素 for(i = 1; i < n; i++) {

scanf(\

for(j = 0;j < (*L).length; j++) if(e >= *((*L).elem + j)) break;

ListInsert(L, j + 1, e); }

return 1; }

// 进行测试

// 数据元素判定函数(平方关系)

int comp(ElemType c1, ElemType c2) {

if(c1 == c2*c2) return 1; else

return 0; }

// ListTraverse()调用的函数(类型要一致)

void visit(ElemType *c) {

printf(\}

// ListTraverse()调用的另一函数(元素值加倍) void dbl(ElemType *c) {

*c *= 2; }

int main() {

SqList L;

SqList La, Lb, Lc; ElemType e, e0, d; int i;

int j, k, n;

int a[4] = { 3, 5, 8, 11},

b[7] = { 2, 6, 8, 9, 11, 15, 20};

// 初始化操作 i = InitList(&L);

printf(\初始化L后:L.elem=%u L.length=%d L.listsize=%d\\n\\n\ L.elem, L.length, L.listsize);

// 通过插入操作创建一个顺序表 for(j=1;j<=5;j++)

ListInsert(&L, 1, j);

printf(\在L的表头依次插入1~5后:*L.elem=\ for(j =1 ; j <= 5; j++)

printf(\ printf(\

printf(\ L.elem, L.length, L.listsize);

// 判断顺序表是否为空表 i = ListEmpty(L);

printf(\是否空:i=%d(1:是 0:否)\\n\\n\

// 清空顺序表

i = ClearList(&L);

printf(\清空L后:L.elem=%u L.length=%d L.listsize=%d\\n\\n\ L.elem,L.length,L.listsize);

i = ListEmpty(L);

printf(\是否空:i=%d(1:是 0:否)\\n\\n\

// 再次通过插入操作创建一个新的顺序表 for(j = 1; j <= 10; j++) ListInsert(&L,j,j);

printf(\在L的表尾依次插入1~10后:*L.elem=\for(j = 1; j <= 10; j++)

printf(\printf(\

printf(\ L.elem, L.length, L.listsize);

// 插入一个数的操作 ListInsert(&L, 1, 0);

printf(\在L的表头插入0后:*L.elem=\

// 求当前顺序表的长度,并打印顺序表, ListLength(L)返回元素个数 for(j = 1; j <= ListLength(L); j++) printf(\printf(\

printf(\有可能改变) L.length = %d(改变)\ \改变)\\n\\n\ L.elem, L.length, L.listsize);

// 取得顺序表的第5个数并用e返回 GetElem(L, 5, &e);

printf(\第5个元素的值为:%d\\n\\n\

// 返回第一个与j满足关系compare的数据元素的位序 // 在这里举了两个例子,一个符合,一个不符合的 for(j = 3; j <= 4; j++) {

k = LocateElem(L, j, comp); if(k)

printf(\第%d个元素的值为%d的平方\\n\\n\ else

printf(\没有值为%d的平方的元素\\n\\n\}

// 求前驱的操作,在这里举了两个例子,一个符合,一个不符合的(即头) for(j = 1; j <= 2; j++) {

GetElem(L, j, &e0); // 把第j个数据赋给e0 i = PriorElem(L,e0,&e); // 求e0的前驱

if(i == 0)

printf(\元素%d无前驱\\n\\n\ else

printf(\元素%d的前驱为:%d\\n\\n\}

// 求后继操作,在这里同样举了两个例子,一个符合,一个不符合的(即尾) for(j = ListLength(L)-1; j <= ListLength(L); j++) {

GetElem(L,j,&e0); // 把第j个数据赋给e0 i = NextElem(L,e0,&e); // 求e0的后继 if(i == 0)

printf(\元素%d无后继\\n\\n\ else

printf(\元素%d的后继为:%d\\n\\n\}

// 删除操作

k = ListLength(L);

for(j = k+1; j >= k; j--) {

// 删除第j个数据

i = ListDelete(&L, j, &e); if(i == 0)

printf(\删除第%d个数据失败\\n\\n\ else

printf(\删除的元素值为:%d\\n\\n\}

// 对顺序表的所有元素调用函数visit printf(\依次输出L的元素:\ListTraverse(L,visit);

//对顺序表的所有元素调用函数dbl printf(\的元素值加倍后:\// 依次对元素调用dbl(),元素值乘2 ListTraverse(L,dbl); // 显示链表

ListTraverse(L,visit); printf(\

// 销毁顺序表 DestroyList(&L);

printf(\销毁L后:L.elem=%u L.length=%d L.listsize=%d\\n\\n\\n\