一丶顺序表
概念:采用顺序存储的线性表称为顺序表,顺序表中逻辑上相邻的数据元素在物理存储位置上也是相邻的。
二丶定义顺序表
用一维数组来描述顺序表的数据存储。由于顺序表有插入删除等操作,即顺序表的表长会发生改变。因此是数组长度足够大,加入整型变量length来记录此时线性表中数据元素的个数,顺序表的结构如下:
#define MAXSIZE 100
typedef int ElemType;
typedef struct
{
ElemType elem[MAXSIZE]; //数据域
int length; //顺序表的长度
}SeqList;
三丶顺序表的初始化
顺序的初始化即构造一个空表,将表长length设置为0,表示没有存储数据(0号单元不存值)。
SeqList *Init_SeqList()
{
SeqList *L = (SeqList *)malloc(sizeof(SeqList));
L->length = 0;
return L;
}
四丶顺序表的插入
顺序表的插入是指在表的第 i 个位置插入一个新元素 x,插入后是表长加1。并要注意插入的位置是否正常和此时的表是否已经满了。
int In_SeqList(SeqList *L,int i,ElemType x)
{
int j;
if(L->length == MAXSIZE-1)
{
printf("顺序表已经满了\n");
return FALSE;
}
if(i<1 || i>L->length+1)
{
printf("插入的位置有问题\n");
return FALSE;
}
for(j=L->length ; j>=i ; j--)
L->elem[j+1] = L->elem[j];
L->elem[i] = x;
L->length++;
return TRUE;
}
五丶顺序表的删除
顺序表的删除是指将表中的第 i 个元素从顺序表中删除,删除后使表长减1。注意删除的位置是否正确和此时的表是否为空。
int Delete_SeqList(SeqList *L,int i)
{
int j;
if(i<1 || i>L->length)
{
printf("不存在第%d个元素\n",i);
return FALSE;
}
for(j=i ; j<=L->length-1;j++)
L->elem[j] = L->elem[j+1];
L->length--;
return TRUE;
}
六丶顺序表的查找
在顺序表中查找给定元素x相同的值,找到返回x在表中的位置,否则返回FALSE;
int Search_SeqList(SeqList *L,ElemType x)
{
int i=1;
while(i<=L->length && L->elem[i]!=x)
i++;
if(i > L->length)
return FALSE;
else
return i;
}
七丶两个顺序表合并
两个顺序表A和B,其元素均按从大到小排列,然后将这两个顺序表合并成一个顺序表C,要求C也是按从大到小的顺序排列。
void Merge_SeqList(SeqList *A,SeqList *B,SeqList *C)
{
int i,j,k;
i=j=k=1;
while(i<=A->length && j<B->length)
{
if(A->elem[i]<B->elem[j])
C->elem[k++] = A->elem[i++];
else
C->elem[k++] = B->elem[j++];
}
while(i <= A->length)
C->elem[k++] = A->elem[i++];
while(j <= B->length)
C->elem[k++] = B->elem[j++];
C->length = A->length + B->length;
}
总代码
#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define MAXSIZE 100
typedef int ElemType;
typedef struct
{
ElemType elem[MAXSIZE]; //数据域
int length; //顺序表的长度
}SeqList;
//顺序表的初始化
SeqList *Init_SeqList()
{
SeqList *L = (SeqList *)malloc(sizeof(SeqList));
L->length = 0;
return L;
}
//顺序表的插入
int In_SeqList(SeqList *L,int i,ElemType x)
{
int j;
if(L->length == MAXSIZE-1)
{
printf("顺序表已经满了\n");
return FALSE;
}
if(i<1 || i>L->length+1)
{
printf("插入的位置有问题\n");
return FALSE;
}
for(j=L->length ; j>=i ; j--)
L->elem[j+1] = L->elem[j];
L->elem[i] = x;
L->length++;
return TRUE;
}
//顺序表的删除
int Delete_SeqList(SeqList *L,int i)
{
int j;
if(i<1 || i>L->length)
{
printf("不存在第%d个元素\n",i);
return FALSE;
}
for(j=i ; j<=L->length-1;j++)
L->elem[j] = L->elem[j+1];
L->length--;
return TRUE;
}
//顺序表的查找
int Search_SeqList(SeqList *L,ElemType x)
{
int i=1;
while(i<=L->length && L->elem[i]!=x)
i++;
if(i > L->length)
return FALSE;
else
return i;
}
//两个顺序表的合并
void Merge_SeqList(SeqList *A,SeqList *B,SeqList *C)
{
int i,j,k;
i=j=k=1;
while(i<=A->length && j<B->length)
{
if(A->elem[i]<B->elem[j])
C->elem[k++] = A->elem[i++];
else
C->elem[k++] = B->elem[j++];
}
while(i <= A->length)
C->elem[k++] = A->elem[i++];
while(j <= B->length)
C->elem[k++] = B->elem[j++];
C->length = A->length + B->length;
}
//输出顺序表中的数据
void Show_SeqList(SeqList *L)
{
int i;
for(i=1;i<=L->length;i++)
{
printf("%d ",L->elem[i]);
if(i%15 == 0)
printf("\n");
}
printf("\n");
}
void print()
{
printf("1.插入数据\n");
printf("2.删除数据\n");
printf("3.查找数据\n");
printf("4合并两个顺序表\n");
printf("0.退出\n");
printf("请输入你要执行的操作:");
}
//测试函数
void Try_SeqList()
{
SeqList *L;
SeqList *A,*B,*C;
int i,x,choose;
L = Init_SeqList();
for(i=1 ; i<=10 ; i++)
In_SeqList(L,i,i);
printf("顺序表L的初始值为:");
Show_SeqList(L);
do
{
print();
scanf("%d",&choose);
switch ( choose )
{
case 1:
printf("请输入你要插入的位置和值:");
scanf("%d%d",&i,&x);
In_SeqList(L,i,x);
printf("插入数据后,顺序表L的值为:");
Show_SeqList(L);
break;
case 2:
printf("请输入你要删除的位置:");
scanf("%d",&i);
Delete_SeqList(L,i);
printf("删除数据后,顺序表L的值为:");
Show_SeqList(L);
break;
case 3:
printf("请输入你要查找的数据:");
scanf("%d",&x);
printf("%d在第%d个\n",x,Search_SeqList(L,x));
break;
case 4:
A = Init_SeqList();
B = Init_SeqList();
C = Init_SeqList();
In_SeqList(A,1,1);
In_SeqList(A,2,3);
In_SeqList(A,3,5);
In_SeqList(A,4,7);
printf("A : ");
Show_SeqList(A);
In_SeqList(B,1,2);
In_SeqList(B,2,4);
In_SeqList(B,3,6);
In_SeqList(B,4,8);
printf("B : ");
Show_SeqList(B);
printf("合并A和B\n");
Merge_SeqList(A,B,C);
printf("C : ");
Show_SeqList(C);
break;
case 0:
return ;
default:
printf("你的选择有误!!!\n");
}
printf("按任意键继续……");
getchar();
getchar();
} while (choose != 0);
}
int main(void)
{
Try_SeqList();
return 0;
}