//数组实现线性表(顺序表)
struct node
{
ElemType data[MAXSIZE]; //存放线性表的数组
int length; //线性表的长度
};
typedef struct node SeqList;
//顺序表的初始化(置空)
void SeqListInit(SeqList L)
{
L.length = ;
}
//顺序表的长度
int SeqListLength(SeqList L)
{
return L.length;
}
//顺序表的取元素操作
ElemType SeqListGet(SeqList L, int i)
{
if( (i>=) && (i<=L.length) ) //判断是否合法
return L.data[i-];
else
{
printf("i值不合法");
exit();
}
}
//exit(0)是一个库函数,它使程序立即正常终止。如果参数值为0,则认为是正常退出,如果参数值为非零,则认为是非正常退出,说明存在着执行错误。
//顺序表的定位操作
int SeqListLocation(SeqList L, ElemType e)
{
int i =;
while( (i<=L.length) && (e!=L.data[i-]) )
i++;
if(i<=L.length)
return i; //返回元素e在顺序表中的位置
else
{
printf("此元素不在表中");
return ;
}
}
//顺序表的求前驱操作
ElemType SeqListPrior(SeqList L, ElemType e)
{
int i = SeqListLocation(L,e);
if(==i) //先判断e是否为第一个元素
{
printf("第一个元素没有前驱");
exit();
}
else
return L.data[i-];
}
//顺序表的后继操作
ElemType SeqListLater(SeqList L, ElemType e)
{
int i = SeqListLocation(L,e);
if(L.length == i)
{
printf("最后一个元素没有后继");
exit();
}
else
return L.data[i];
}
//顺序表的前插操作
void SeqListInsert(SeqList L, int i, ElemType b)
{
if(L.length == MAXSIZE) //表满
{
printf("表已满,无法进行插入操作\n");
exit();
}
if( (i<) || (i>L.length+) ) //i值不合适
{
printf("i值不合适\n");
exit();
}
int j;
for(j=L.length-; j>i-; j--) //移出插入元素的位置
L.data[j+] = L.data[j];
L.data[i-] = b;
L.length++;
}
//顺序表的删除操作
void SeqListDel(SeqList L, int i)
{
if( (i<) || (i>L.length) ) //i值不合法
{
printf("i不合法");
exit();
}
int j;
for(j=i; j<=L.length-; j++)
L.data[j-] = L.data[j];
L.length--;
}
//顺序表的判空操作
bool SeqListEmpty(SeqList L)
{
return !L.length; //查看变量length的值是否为0,为0返回true,否则返回false
}
//顺序表的遍历操作
void SeqListTraverse(SeqList L)
{
int i;
if(SeqListEmpty(L))
printf("只是一个空表");
else
for(i=; i<=L.length; i++)
printf("%d", L.data[i-]);
}
//线性表的合并:直接合并,保存合并
//直接合并:将存在于线性表Lb但不存在于线性表La的元素插入La中
void SeqListUnion(SeqList La, SeqList Lb)
{
int n,i;
n = SeqListLength(La);
for(i=; i<=SeqListLength(Lb); i++)
{
ElemType x = SeqListGet(Lb, i);
if(SeqListLocation(La,x) == )
{
SeqListInsert(La, n+, x);
n++;
}
}
}
//保存合并:两个都是有序的线性表,合并成一个新的线性表,新的线性表仍然是有序的
void SeqListMerge(SeqList La, SeqList Lb, SeqList Lc)
{
SeqListInit(Lc);
int i =; int j =; int k = ;
while( (i<=SeqListLength(La)) && (j<=SeqListLength(Lb)) )
{
if( SeqListGet(La,i) <= SeqListGet(Lb,j) )
{
SeqListInsert(Lc, k+, SeqListGet(La,i));
k++; i++;
}
else
{
SeqListInsert(Lc, k+, SeqListGet(Lb,j));
k++; i++;
}
}
while( i<=SeqListLength(La) ) //将La中剩余的元素插入到Lc中
{
SeqListInsert(Lc, k+, SeqListGet(La,i));
k++; i++;
}
while( j<=SeqListLength(Lb) ) //将Lb中剩余的元素插入到Lc中
{
SeqListInsert(Lc, k+, SeqListGet(Lb,j));
k++; j++;
}
}
建立一个顺序表,用户通过输入个数和一组非递减顺序的数,即顺序表按照非递减顺序排列,对顺序表进行建立,删除指定位置的数,查找指定位置的数,插入一个数字功能。程序代码如下:
#include "stdio.h"
#include "stdlib.h"
#define listsize 100
typedef struct{
int data[listsize];
int length;
}Seqlist;
void main()
{
void createlist(Seqlist *l,int n);
void printlist(Seqlist *l,int n);
void locateElem(Seqlist *l,int n);
void listinsert(Seqlist *l,int i,int n);
void listdelete(Seqlist *l,int i,int n);
int n;
int i=;
Seqlist l;
l.length=;
printf("请输入线性表长度:");
scanf("%d",&n);
createlist(&l,n);
printlist(&l,n);
locateElem(&l,n);
listinsert(&l,i,n);
listdelete(&l,i,n);
printf("\n");
}
//新建顺序表
void createlist(Seqlist *l,int n)
{
int i;
printf("请输入顺序表元素:\n");
for(i=;i<n;i++)
{
scanf("%d",&l->data[i]);
l->length=n;
}
}
//输出顺序表
void printlist(Seqlist *l,int n)
{
int i;
printf("顺序表为:");
for(i=;i<n;i++)
{
printf("%d ",l->data[i]);
}
}
//查找元素
void locateElem(Seqlist *l,int n)
{
int i=,*p;
p=l->data;
printf("\n请输入要查找的元素n:");
scanf("%d",&n);
while(i<=l->length&&(*p++!=n)) ++i;
if(i<=l->length)
printf("要查找的数的位置为:%d",i);
}
//插入元素
void listinsert(Seqlist *l,int i,int n)
{
int *q,*p;
printf("\n请输入要插入的数:");
scanf("%d",&n);
if(l->length==)
{
l->data[]=n;
++l->length;
}
q=&(l->data[]);
while((*q<=n)&&(q<=&(l->data[l->length-])))
{
++q;
}
++l->length;
for(p=&(l->data[l->length-]);p>=q;--p)
{
*(p+)=*p;
*p=n;
}
printf("输出新表:\n");
for(i=;i<l->length;i++)
{
printf("%d ",l->data[i]);
}
}
//删除元素
void listdelete(Seqlist *l,int i,int n)
{
int *p,*q;
printf("\n请输入要删除的数的位置:");
scanf("%d",&i);
if(i<||i>l->length)
printf("删除元素失败!");
p=&l->data[i-];
n=*p;
q=l->data+l->length-;
for(++p;p<=q;++p)
{
*(p-)=*p;
--l->length;
}
for(i=;i<l->length+;i++)
{
printf("%d ",l->data[i]);
}
}