seqlist.h
typedef struct alist
{int n; //表元素数量
int maxsize; //表数组长度
ListItem *table; //表动态数组
}Alist;
typedef struct alist *List;
List ListInit(int size) //表结构初始化
{
List L=(List)malloc(sizeof(alist)); //表空间初始化
L->table=(ListItem *)malloc(size*sizeof(ListItem)); //分配指定size个元素的空间
L->maxsize=size; //表数组长度定为size
L->n=0; //表实际元素为0个
return L;}
void DestroyList(List L)
{
if (L) free(L); //释放线性表占据的所有存储空间
}
void ListEmpty(List L) //清空表
{
L->n=0; //表实际元素为0个
}
int ListLength(List L)
{
return L->n; //取得表实际元素为n个
}
int IsEmpty(List L)
{
if (L->n==0) return 1;
else return 0;
}
int ListLocate(ListItem x,List L) //查找元素x在L中的位置
{
int i;
for(i=0;i<L->n;i++)
if(L->table[i]==x) return ++i;
return 0;
}
ListItem ListRetrieve(int k,List L) //查找第k个元素的值
{
if(k<1||k>L->n) printf("out of bounds");
return L->table[k-1];
}
void ListInsert(int k,ListItem x,List L) //在第k个元素后添加元素x
{
int i;
if(k<0||k>L->n) printf("out of bounds");
if(L->n==L->maxsize) printf("out of memory");
for(i=L->n -1;i>=k;i--)L->table[i+1]=L->table[i];
L->table[k]=x;
L->n++;
}
ListItem ListDelete(int k,List L) //在第k个位置删除元素x
{
int i;
ListItem x;
if(k<1||k>L->n) printf("out of bounds");
x=L->table[k-1];
for(i=k;i<L->n;i++)L->table[i-1]=L->table[i];
L->n--;
return x;
}
ListItem PriorElem(ListItem x,List L)
{
//请在下面编写代码,返回X的前驱
int i;
for(i=1;i<L->n;i++)
if(L->table[i]==x) return L->table[i-1];
return 0;
}
ListItem NextElem(ListItem x,List L)
{
//请在下面编写代码,返回X的后继
int i;
for(i=0;i<L->n-1;i++)
if(L->table[i]==x) return L->table[i+1];
return 0;
}
void Reverse(List L)
{
//请在下面编写代码,完成L的反转
ListItem temp;
for(int i=0;i<L->n/2;i++)
{temp=L->table[i];L->table[i]=L->table[L->n-1-i];L->table[L->n-1-i]=temp;}
}
List Merge(List A,List B)
{List L=ListInit(A->n+B->n);
return L;
}
void Merge(List A,List B,List L)
{
//合并A和B到L中,要求降序排列
L->n=A->n+B->n;
int i=0,j=0,k=0;
while(j<A->n&&k<B->n)
if(A->table[j]>B->table[k])L->table[i++]=A->table[j++];
else L->table[i++]=B->table[k++];
if(j>=A->n)
for(;k<B->n;k++)
L->table[i++]=B->table[k];
else
for(;j<A->n;j++)
L->table[i++]=A->table[j];
}
void Alternate(List A,List B,List L)
{
//交叉合并A和B到L中
int i=0,j=0,k;
for (k=0;i<=A->n || j<=B->n;i++,j++)
{ L->table[k++]=A->table[i];
L->table[k++]=B->table[j]; }
L->n=k-2;
}
seqlist.cpp
#include<stdio.h>
#include<stdlib.h>
typedef int ListItem;
#include "seqlist.h"
void PrintList(List L)
{
int n,i;
n=ListLength(L);
for(i=1;i<=n;i++)
{
printf("%6d",ListRetrieve(i,L));
if(i%10==0)
printf("/n");
}
printf("/n");
}
void main()
{
int i,data[5]={8,34,67,9,1},data1[5]={67,55,34,12,8},data2[6]={61,31,5,3,2,1};
List L,L1,L2;
L=ListInit(50);
for(i=0;i<5;i++)
{ ListInsert(i,data[i],L);}
printf("原始的线性表:/n");
PrintList(L);
//检验前驱函数
printf("34的前驱是%d/n",PriorElem(34,L));
printf("8的前驱是%d/n",PriorElem(8,L));
//检验后继函数
printf("9的后继是%d/n",NextElem(9,L));
printf("1的后继是%d/n",NextElem(1,L));
//检验反转函数
Reverse(L);
printf("反转后的线性表:/n");
PrintList(L);
//检验Merge函数
//初始化L1 “67,55,34,12,8”
L1=ListInit(10);
for(i=0;i<5;i++)
{ ListInsert(i,data1[i],L1);}
printf("原始的线性表L1:/n");
PrintList(L1);
//初始化L2 “61,31,5,3,2,1”
L2=ListInit(10);
for(i=0;i<6;i++)
{ ListInsert(i,data2[i],L2);}
printf("原始的线性表L2:/n");
PrintList(L2);
//调用MERGE函数并显示结果应为"67,61,55,34,31,12,8,5,3,2,1"
ListEmpty(L);
Merge(L1,L2,L);
printf("合并后的线性表:/n");
PrintList(L);
//调用Alternate函数并显示结果应为"67,61,55,31,34,5,12,3,8,2,1"
ListEmpty(L);
Alternate(L1,L2,L);
printf("交叉合并后的线性表:/n");
PrintList(L);
//销毁线性表
DestroyList(L2);
DestroyList(L1);
DestroyList(L);
}