一、顺序表的存储结构
1.选择合适头文件,不同的头文件中封装了不同的函数类型
2.define是宏定义,程序在预处理阶段将用define定义的内容进行了替换,只是进行了替换,在编译时不能进行数据类型检验 ,例如定义了 List_Init_Size 为 100,ListIncrement 为 10 只要出现 List_Init_Size,系统会默认将其用100替换掉。
3.typedef为C语言关键字,作用是作为一种数据类型定义一个新名字,这里的数据类型包括内部数据类型和自定义数据类型,例如 int (原数据类型名称 ) 别名为 ElemType(数据类型新名称 )可以理解为 ElemType替代了int
4.struct 结构体 通俗的讲就是打包封装一些有共同特征的不同数据的变量封装在内部,通过一定的方法访问修改内部变量,可以说结构体让一些很散的数据变得很整(井然有序)
#include <stdlib.h>
#include <stdio.h>
#include <stdbool.h>
# define List_Init_Size 100
# define ListIncrement 10
typedef int ElemType; //定义数据元素的类型
typedef struct {
ElemType *elem; //存储空间基址
int length; //当前长度(数据元素个数)
int ListSize;//当前分配的存储容量
} Sqlist; //定义顺序表的类型
二、构造函数
1.顺序表初始化函数
//顺序表初始化函数
bool InitList (Sqlist *L){
L->elem=(ElemType *)malloc(List_Init_Size*sizeof(ElemType));//为顺序表分配一个大小为List_Init_Size的数组空间
if (!L->elem) exit(0) ;
L->length=0;
L->ListSize=List_Init_Size;
return true;
}
2.顺序表插入第i个元素
//向顺序表插入第i个元素
void InsertList(Sqlist *L,int i,ElemType x)
{ //int j;
if(i <1 || i >L->length+1)
{printf("Position error");
return;
}
if(L->length>=L->ListSize)
{printf("overflow");
exit(EXIT_FAILURE);
}
for(int j=L->length-1;j>= i-1;--j)
L->elem[j+1]=L->elem[j];
L->elem[i-1]=x;
++L->length;
return;
}
3.删除顺序表中第i个数据元素
//删除顺序表中第i个数据元素
void deleteList(Sqlist *L,int i)
{
int j;
if(i<1 || i>L->length)
{
printf("Position error");
return;
}
for(j=i;j<L->length;j++)
L->elem[j-1]=L->elem[j];
L->length--;
}
4.查找元素x,找到返回序号,找不到返回0
//查找元素x,找到返回序号,找不到返回0
int Locate(Sqlist L, ElemType x)
{ int i=1;
while(i<=L.length && L.elem[i-1]!=x)
++i;
if(i<=L.length) return i;
else return 0;
}
5.获取第i个元素
//获取第i个元素
void GetElem(Sqlist L,int i, ElemType *e)
{
*e=L.elem[i-1];
}
6.返回顺序表的长度
//返回顺序表的长度
int ListLength(Sqlist L)
{
return L.length;
}
7.输出顺序表
//输出顺序表
void Output(Sqlist L)
{
printf("number of elements:%d\n",L.length);
for (int i=1;i<=L.length;i++)
{
printf("%d element:%d\n",i,L.elem[i-1]);
}
}
8.输入n个数据元素
//输入n个数据元素
void Input(Sqlist *L)
{
int n,x;
scanf ("%d",&n);
for (int i=1;i<=n;i++)
{
scanf ("%d",&x);
L->elem[i-1]=x;
L->length++;
}
}
9.两个线性表并运算
//两个线性表并运算
void unio(Sqlist *La,Sqlist Lb) {
ElemType e;
int La_len=La->length;
int Lb_len=Lb.length;
for(int i=1;i<=Lb_len;++i) {
GetElem(Lb,i,&e);
if(!Locate(*La,e))
InsertList(La,++La_len,e);
}
Output(*La);
}
10.将两个顺序表合并到第三个顺序表中
//将两个顺序表合并到第三个顺序表中
void mergelist(Sqlist La,Sqlist Lb,Sqlist *Lc){
int i=1,j=1,k=0;
ElemType ai,bj;
int La_len=ListLength(La);
int Lb_len=ListLength(Lb);
while((i<=La_len)&&(j<=Lb_len))
{
GetElem(La,i,&ai);GetElem(Lb,j,&bj);
if(ai<=bj)
{
InsertList(Lc,++k,ai);++i;
}
else {InsertList(Lc,++k,bj);++j;}
}
while(i<=La_len){
GetElem(La,i++,&ai);InsertList(Lc,++k,ai);
}
while(j<=Lb_len){
GetElem(Lb,j++,&bj);InsertList(Lc,++k,bj);
}
Output(*Lc);
}
三、主函数
int main(int argc, const char * argv[]) { //主函数
Sqlist L,La,Lb,Lc;
int conti=1,choice=0,loc=0; ElemType x;
while (conti)
{
printf("1.Initial 2.Insert 3.Delete 4.Locate 5.并集 6.Merge 7.Output 8.Exit");
scanf ("%d",&choice);
switch (choice){
int i;
case 1:
InitList(&L);break;
case 2:
printf("请输入要插入的位置");
scanf ("%d",&i);
printf("请输入要插入的内容");
scanf ("%d",&x);
InsertList(&L,i,x);
break;
case 3:
printf("请输入要删除的位置");
scanf ("%d",&i);
deleteList(&L,i);
break;
case 4:
printf("请输入要定位的内容:");
scanf ("%d",&x);
loc = Locate(L,x);
if (!loc) printf("该元素不存在\n");
else printf("该元素的序号是:%d \n",loc);
break;
case 5:
InitList(&La);
InitList(&Lb);
printf("请输入La中的元素个数:");
Input(&La);
printf("请输入Lb中的元素个数:");
Input(&Lb);
unio(&La,Lb);
break;
case 6:
InitList(&La);
InitList(&Lb);
InitList(&Lc);
printf("请输入La中的元素个数:");
Input(&La);
printf("请输入Lb中的元素个数:");
Input(&Lb);
mergelist(La,Lb,&Lc);
break;
case 7:
Output(L); break;
case 8:
conti=0;
break;
}
}
return 0;
}
四、运行结果部分操作