今天是线性表中的顺序表的实现,主要实现函数如下,读者有需要可以评论,我可以适当加几个。
//实现数组的以下操作,并编写程序验证你的操作。
int InputList(SeqList *L,int n); //输入n个整数存放到数组中
int PrintList(SeqList *L); //输出数组中的所有元素
int Locate(SeqList *L,ElemType e); //在数组L中查找e,返回找到的下标,否则返回-1
int InsList(SeqList *L,int i,ElemType e); //在数组L中下标为i的位置上插入元素e
int *DelList(SeqList *L,int i); //在数组L中删除下标为i的位置上的元素,用e返回删除元素的值
void merge(SeqList *LA, SeqList *LB, SeqList *LC); //将两个有序数组LA,LB 合并成一个数组LC。
代码如下:
#include<stdio.h>
#include<stdlib.h>
#define maxsize 20 //数组的最大长度;
typedef int ElemType;
typedef struct
{ ElemType elem[maxsize]; /*数组占用的空间*/
int last; /*最后一个元素在数组elem[ ] 中的位置(下标值),空表置为-1*/
}SeqList;
SeqList list;
SeqList LA,LB,LC; //定义线性表数组
//实现数组的以下操作,并编写程序验证你的操作。
int InputList(SeqList *L,int n); //输入n个整数存放到数组中
int PrintList(SeqList *L); //输出数组中的所有元素
int Locate(SeqList *L,ElemType e); //在数组L中查找e,返回找到的下标,否则返回-1
int InsList(SeqList *L,int i,ElemType e); //在数组L中下标为i的位置上插入元素e
int *DelList(SeqList *L,int *i); //在数组L中删除下标为i的位置上的元素,用*e返回删除元素的值
void merge(SeqList *LA, SeqList *LB, SeqList *LC); //将两个有序数组LA,LB 合并成一个数组LC。
int InputList(SeqList *L,int n) //函数作用为输入n个整数存放到数组中
{
L->last=n-1; //将最后一个数组元素下标赋值给L->last
printf("请输入信息入数组\n");
int i;
for(i=0;i<n;i++)
{
scanf("%d",&L->elem[i]); //输入信息入每个数组
}
}
int PrintList(SeqList *L) //函数作用为打印每个数组的全部元素
{
printf("执行打印操作:\n");
printf("打印输出数组信息如下:\n");
int i,j=0; //定义j的作用为换行所用
for(i=0;i<=L->last;i++)
{
printf("%4d",L->elem[i]);
j++;
if(j%4==0) //每输出4个元素换行一次
printf("\n");
}
printf("\n");
}
int Locate(SeqList *L,ElemType e) //函数作用为查找值e所在数组的下标位置
{
int i;
for(i=0;i<=L->last;i++)
{
if(L->elem[i]==e) //查找到就跳出
break;
}
if(i>L->last) //遍历数组后未发现值等于e返回-1
return -1;
else
return i; //找到就返回所在数组下标
}
int InsList(SeqList *L,int i,ElemType e) //函数作用为插入一个数进位置i
{
while(i<0||i>L->last+1) //判断插入位置是否合法
{
printf("插入位置不合法请从新输入插入位置: ");
scanf("%d",&i);
}
if(i>L->last) //如果插入位置为最后一个就插到最后一个
{
L->last++; //插入元素数组的最后L->last更换
L->elem[i]=e;
}
else //插入位置不为最后一个
{
int j;
for(j=L->last;j>=i;j--) //从最后一个元素开始往后移开一位
{
L->elem[j+1]=L->elem[j];
}
L->elem[i]=e;
L->last++; //插入元素数组的最后L->last更换
}
}
int *DelList(SeqList *L,int *i) //函数作用删除位置为i的元素,i用指针原因将i传出函数
{
int k=*i; //保存第一次输入的i值
ElemType *e; //作用为传出删除元素e的地址
while(k<0||k>L->last) //判断是否插入元素合法,不合法继续输入插入位置i
{
printf("删除位置不合法请从新输入删除位置: ");
scanf("%d",&k);
}
*i=k; //将最后一次输入的合法的i赋值给*i,便于主函数的输出i
int j;
*e=L->elem[k]; //保存删除元素,最后返回用e返回
for(j=k+1;j<=L->last;j++)
{
L->elem[j-1]=L->elem[j]; //将所有的从i+1的元素向后移动一位
}
L->last--; //改变L->last的值
return e; //返回删除元素
}
void merge(SeqList *LA, SeqList *LB, SeqList *LC) //函数作用为合并俩数组
{
int i=0,j=0,k=0;
while((i<=LA->last)&&(j<=LB->last)) //比较数组LA,LB的值,非递减的顺序合并
{
if(LA->elem[i]<=LB->elem[j]) //比较L->A,L->B的值,将较小的插入L->C中
{
LC->elem[k]=LA->elem[i]; //将较小的插入L->C中
i++,k++; //插入后下标都+1
}
else
{
LC->elem[k]=LB->elem[j]; //同理插入较小的元素进L->C
j++,k++; //插入后下标往后移动一位
}
}
if(i>LA->last) //如果数组L->A比L->B长度短就将L->B剩下的元素插入L->C中
{
for(j;j<=LB->last;j++)
{
LC->elem[k]=LB->elem[j];
k++;
}
}
else //如果数组L->A比L->B长度长就将L->A剩下的元素插入L->C中
{
for(i;i<=LB->last;i++)
{
LC->elem[k]=LA->elem[i];
k++;
}
}
LC->last=k-1; //更新LC->last的值
}
int main()
{ printf("创建数组:\n");
printf("请输入数组元素的个数 ");
int n;
scanf("%d",&n); //输入创建的数组的长度
InputList(&list,n); //调用创建函数
PrintList(&list); //调用打印输出函数
int search_subscript,e1; //定义需要查找的e1,和即将返回的元素下标search_subscript
printf("执行查找操作:\n");
printf("请输入需要查找的元素值 ");
scanf("%d",&e1); //输入查找的元素的值e1
search_subscript=Locate(&list,e1); //将查找的元素的下标返回给 search_subscript
if(search_subscript==-1) //查找的元素不存在
printf("查找的元素不存在于此数组");
else
printf("经过查找的元素的下标为 %d\n",search_subscript); //输出查找的元素下标
int i,e2; //定义插入位置i和插入元素e2
printf("执行插入操作:");
printf("请输入需要插入的元素下标和元素值 ");
scanf("%d%d",&i,&e2); //输入位置i和插入元素e2
InsList(&list,i,e2); //调用插入函数
printf("插入后元素后的新数组信息如下\n");
PrintList(&list); //打印输出插入后的新数组
int *e3; //定义要删除的元素的值
printf("执行删除操作:\n");
printf("请输入要删除的数组的下标 ");
scanf("%d",&i); //输入要删除的位置i
e3=DelList(&list,&i); //将删除的元素的值返回赋值给e3
printf("删除元素后的数组信息如下\n");
PrintList(&list); //打印输出删除后的数组
printf("删除的下标%d的元素的值为%d\n",i,*e3);
printf("执行合并数组操作:即将创建两个数组LA,和LB\n");
int n1,n2,count=1; //定义需要创建的两数组的长度,cuont为下面计算输出的第几个数组
printf("请输入创建的俩数组的元素的个数n1和n2分别是: ");
scanf("%d%d",&n1,&n2); //输入俩数组长度
printf("创建的第%d个数组如下:\n",count++);
InputList(&LA,n1); //调用创建函数数组LA
printf("创建的第%d个数组如下:\n",count++);
InputList(&LB,n2); //调用创建函数数组LB
merge(&LA,&LB,&LC); //调用合并函数
PrintList(&LC); //打印输出的合并后的函数LC
}
代码为本人学习数据结构时曾经写的作为参考,欢迎读者提出错误纠正