- 线性表顺序存储的结构
- 创建有序的顺序表
- 遍历顺序表
- 插入一个元素
- 合并两个有序的顺序表到一个顺序表中
- 主函数调用
目录:
各部分实现:
线性表顺序存储的结构
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct tagSeqList
{
int data[MAXSIZE+1];/*线性表占用的数组空间,且从data[1]开始存储*/
int last;/*记录最后一个元素在数组中的位置*/
}
创建有序的顺序表
void CreateList(SeqList *L,int n)
/*创建含n个元素的线性表*/
{
int i=1;/*从data[1]开始存储第一个元素*/
L->last=n;
for(;i<=n;i++)
{
scanf("%d",&L->data[i]);
}
}
遍历顺序表
void ListTraverse(SeqList *L)
{
int i=1;
for(;i<=L->last;i++)
{
printf("%d ",L->data[i]);
}
}
插入一个元素
创建的顺序表是有序的且为升序,因此进行插入元素时需要找到插入位置,并改变其他元素位置。
void InsList(SeqList *L,int a)
{
int i=L->last;
while(L->data[i]>a&&i>=1)
/*从最后一个元素找需要插入的元素的位置,并将大于被插入元素的其他元素
位置后移一个,直到找到对应位置*/
{
L->data[i+1]=L->data[i];
i--;
}
L->data[i+1]=a;/*找到对应插入位置插入元素*/
L->last++;
}
合并两个有序的顺序表到一个顺序表中
设置一个空表L3,分别设置两个指针i,j指向L1、L2中的元素,当L1->data[i]<=L2->data[j]时,j将L1->data[i]的元素插入L3,并将i指向L1中的下一个元素,否则将L2->data[j]的元素插入L3,再使j指向L2的下一个元素。最后L1或L2中没扫完的元素全都插入到L3中,由此得到合并的有序顺序表。
void MergeList(SeqList *L1,SeqList *L2,SeqList *L3)
{
int i=1,j=1,k=0;
/*使i,j都分别指向表L1、L2的第一个元素,定义表L3为空*/
{
k++;
if(L1->data[i]<=L2->data[j])
{
L3->data[k]=L1->data[i];
i++;
}
else
{
L3->data[k]=L2->data[j];
j++;
}
}
while(i<=L1->last)
/*若表L1未扫完,将表L1的剩余插入到表L3*/
{
k++;
L3->data[k]=L1->data[i];
i++;
}
while(j<=L2->last)
/*若表L2未扫完,将表L2的剩余插入到表L3*/
{
k++;
L3->data[k]=L2->data[j];
j++;
}
L3->last=k;
}
主函数调用
int main()
{
int n,a;
SeqList L,Q,M;
scanf("%d%d",&n,&a);/*先输入表L元素的个数,以及之后要插入的元素*/
CreateList(&L,n);/*创建表L,且要升序输入*/
InsList(&L,a);/*插入一个元素*/
ListTraverse(&L);/*遍历插入a之后的表L*/
printf("\n");
scanf("%d",&n);/*输入表Q元素的个数*/
CreateList(&Q,n);/*创建表Q,且要升序输入*/
MergeList(&L,&Q,&M);/*合并表L和表Q到表M*/
ListTraverse(&M);/*遍历表M*/
return 0;
}
全部代码:
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef struct tagSeqList
{
int data[MAXSIZE+1];
int last;
}SeqList;
void CreateList(SeqList *L,int n)
{
int i=1;
L->last=n;
for(;i<=n;i++)
{
scanf("%d",&L->data[i]);
}
}
void ListTraverse(SeqList *L)
{
int i=1;
for(;i<=L->last;i++)
{
printf("%d ",L->data[i]);
}
}
void InsList(SeqList *L,int a)
{
int i=L->last;
while(L->data[i]>a)
{
L->data[i+1]=L->data[i];
i--;
}
L->data[i+1]=a;
L->last++;
}
void MergeList(SeqList *L1,SeqList *L2,SeqList *L3)
{
int i=1,j=1,k=0;
while(i<=L1->last&&j<=L2->last)
{
k++;
if(L1->data[i]<=L2->data[j])
{
L3->data[k]=L1->data[i];
i++;
}
else
{
L3->data[k]=L2->data[j];
j++;
}
}
while(i<=L1->last)
{
k++;
L3->data[k]=L1->data[i];
i++;
}
while(j<=L2->last)
{
k++;
L3->data[k]=L2->data[j];
j++;
}
L3->last=k;
}
int main()
{
int n,a;
SeqList L,Q,M;
scanf("%d%d",&n,&a);
CreateList(&L,n);
InsList(&L,a);
ListTraverse(&L);
printf("\n");
scanf("%d",&n);
CreateList(&Q,n);
MergeList(&L,&Q,&M);
ListTraverse(&M);
return 0;
}