- 运行样例程序,理解静态分配顺序存储结构的线性表的下列基本操作。
(1)初始化顺序表 (2)创建顺序表 (3)判断空表 (4)求顺序表长度 (5)输出顺序表 (6)取顺序表位置 i 的元素值 (7)在顺序表中查找值为 e 的元素位置 (8)向顺序表中插入一个元素 (9)从顺序表中删除一个元素
#include<stdio.h>
#define MaxSize 50
typedef int ElemType;
typedef struct
{
ElemType data[MaxSize];
int length;
}SqList;//结构体变量
void InitList(SqList &L)//引用类型
{
L.length=0;
}
void CreateList(SqList &L,int n)
{
int i;
printf("输入%d个元素:\n",n);
for(i=0;i<n;i++)
scanf("%d",&L.data[i]);
printf("\n");
L.length=n;
}
int ListEmpty(SqList L)
{
return(L.length==0);
}
int ListLength(SqList L)
{
return(L.length);
}
void DispList(SqList L)
{
int i;
if(L.length==0)return;
for(i=0;i<L.length;i++)
printf("%d",L.data[i]);
printf("\n");
}
int GetElem(SqList L,int i,ElemType &e)
{
if(i<1||i>L.length)return 0;
e=L.data[i-1];
return 1;
}
int LocateElem(SqList L,ElemType e)
{
int i=1;
while(i<=L.length&&L.data[i-1]!=e)i++;
if(i<=L.length)
return i;
else return 0;
}
int ListInsert(SqList &L,int i,ElemType e)
{
int j;
if(i<1||i>L.length+1)return 0;
for(j=L.length-1;j>=i-1;j--)
L.data[j+1]=L.data[j];
L.data[i-1]=e;
++L.length;
return 1;
}
int ListDelete(SqList &L,int i,ElemType &e)
{
int j;
if(i<1||i>L.length)return 0;
e=L.data[i-1];
for(j=i-1;j<L.length-1;j++)
L.data[i]=L.data[j+1];
-L.length;
return 1;
}
int main()
{
ElemType dd,a,b;
SqList L;
InitList(L);
if(ListEmpty(L))
printf("顺序表为空!\n");
printf("创建顺序表!");
CreateList(L,5);
printf("输出顺序表所有元素!\n");
DispList(L);
printf("输出顺序表长度!\n");
printf("ListLength(L)=%d\n",ListLength(L));
printf("判断顺序表是否为空!\n");
printf("ListEmpty(L)=%d\n",ListEmpty(L));
printf("输出顺序表第三个位置元素到dd!\n");
GetElem(L,3,dd);
printf("dd=%d\n",dd);
printf("查找元素a:");
scanf("%d",&a);
printf("元素%d在顺序表的位置为:%d\n",a,LocateElem(L,a));
printf("插入元素b:");
scanf("%d",&b);
printf("在顺序表第四个位置插入%d!\n",b);
ListInsert(L,4,b);
printf("输出插入操作后顺序表所有元素!\n");
DispList(L);
printf("删除顺序表第三个位置的元素!\n");
ListDelete(L,3,dd);
printf("输出删除操作后顺序表所有元素!\n");
DispList(L);
}
2、采用书上第 22 页定义的线性表动态分配顺序存储结构,编程实现书中算法 2.3、算法 2.4 和算法 2.5。 提示:要实现算法 2.4 和 2.5,必须先创建 n 个数据元素的顺序表,另外输出顺序表的操作也是必要的。
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
#include<math.h>//overflow头文件
#include<stdlib.h>
#define LISTSIZE 100
#define ADD 10
#define ERROR 0
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;
int InitList(SqList &L)//初始化数据
{
L.elem=(ElemType *)malloc(LISTSIZE *sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
L.length=0;
L.listsize=LISTSIZE;
return 0;
}
int ListLength(SqList L)
{
return(L.length);
}
void CreateList(SqList &L)//初始化线性表
{
int i=0;
srand((unsigned)time(NULL));
for(i=0; i < LISTSIZE; i++) {
L.elem[i] = rand()%100;
L.length++;
}
}
void ListDelete(SqList &L,int i,ElemType &e)
{
if(i>L.length||i<1)exit(OVERFLOW);
ElemType* p;
ElemType*q;
p=L.elem+i-1;
e=*p;
q=L.elem+L.length-1;
for(;p<q;p++)
*p=*(p+1);
L.length--;
}
void Select()
{
printf("**********************************************\n");
printf("初始化线性表完成\n");
printf("可进行操作如下\n1.插入元素\t2.删除某个元素\t3.寻找某个元素\t0.退出");
}
int ListInsert(SqList &L,int i,ElemType e)
{
ElemType* newbase;
if(i<1||i>L.length+1)return ERROR;
if(L.length>=L.listsize){
newbase=(ElemType*)realloc(L.elem,(L.listsize+ADD)*sizeof(ElemType));
if(!newbase)exit(OVERFLOW);
L.elem=newbase;
L.listsize+=ADD;
}
ElemType * p;
ElemType * q;
p=L.elem+i-1;
for(q=L.elem+L.length-1;q>=p;q--)*(q+1)=*q;
*p=e;
L.length+=1;
return 0;
}
int LocateElem(SqList L,ElemType e)//查找表中元素
{
int i=1;
ElemType *p=L.elem;
while(i<=L.length&&*p++!=e)++i;
if(i<=L.length)return i;
else return 0;
}
int main()
{
int i;
SqList L;
InitList(L);
CreateList(L);
Select();
printf("\n现在的线性表为:\n");
for(i=0;i<L.length;i++)
{printf("%d\t",L.elem[i]);
if((i+1)%10==0)printf("\n");}
int select=1;
ElemType e;
while(select!=0)
{
printf("\n请选择操作\n");
scanf("%d",&select);
if(select!=0&&select!=1&&select!=2&&select!=3)return ERROR;
switch(select){
case 1:printf("请输入插入的元素和插入的位置\n");
scanf("%d %d",&e,&i);
ListInsert(L,i,e);
printf("插入后的线性表为:\n");
for(i=0;i<L.length;i++)
{printf("%d\t",L.elem[i]);
if((i+1)%10==0)printf("\n");}break;
case 2:printf("请输入删除的位置\n");
scanf("%d",&i);
ListDelete(L,i,e);
printf("删除后的线性表为:\n");
for(i=0;i<L.length;i++)
{printf("%d\t",L.elem[i]);
if((i+1)%10==0)printf("\n");}
break;
case 3:printf("请输入要查找的元素:\n");
scanf("%d",&e);
i=LocateElem(L,e);
if(i==0)printf("未查找到该元素\n");
else printf("该元素位序是%d\n",i);
break;
case 0:break;}
}
return 0;
}
3、采用线性表动态分配顺序存储结构,实现顺序表的合并操作:①设有线性表 La 和 Lb,试设计算法将 La 和 Lb 归并为新的线性表 Lc;②设线性表 La 和 Lb 中的数据元素为整数,且均已按值非递减有序排列, 要求 Lc 中的数据元素也按值非递减有序排列
#include<stdio.h>
#include<string.h>
#include<malloc.h>
#include<time.h>
#include<math.h>//overflow头文件
#include<stdlib.h>
#define LISTSIZE 100
#define ADD 10
#define ERROR 0
typedef int ElemType;
typedef struct{
ElemType *elem;
int length;//当前长度
int listsize;//当前分配的存储容量
}SqList;
void MergeList(SqList La,SqList Lb,SqList &Lc)
{
ElemType *pa=La.elem;
ElemType *pb=Lb.elem;
Lc.length=La.length+Lb.length;
ElemType * pc=Lc.elem;
Lc.elem=(ElemType *)malloc(Lc.length *sizeof(ElemType));
if(!Lc.elem)exit(OVERFLOW);
int i=0,j=0,k=0;
for(;i<La.length&&j<Lb.length;){
if(La.elem[i]<=Lb.elem[j]){
Lc.elem[k]=La.elem[i];
i++;k++;
}
else{Lc.elem[k]=Lb.elem[j];
j++;k++;
}
}
while(i<La.length)
{Lc.elem[k]=La.elem[i];
i++;k++;}
while(j<Lb.length)
{Lc.elem[k]=Lb.elem[j];
j++;k++;}
Lc.length=k;
}
void CreateList(SqList &L,int m)//初始化线性表
{
int i=0;
srand((unsigned)time(NULL));
for(i=0; i <L.length; i++) {
L.elem[i] = m*rand()%100;
}
}
int InitList(SqList &L)//初始化数据
{
L.elem=(ElemType *)malloc(L.length*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
return 0;
}
void output(SqList L)
{
for(int i=0;i<L.length;i++)
{printf("%d\t",L.elem[i]);
if((i+1)%10==0)printf("\n");}
}
void pailie(SqList & L)
{
int i=0;ElemType t;
for(;i<L.length-1;i++)
{
for(int j=i+1;j<L.length;j++)
if(L.elem[j]<L.elem[i]){
t=L.elem[j];
L.elem[j]=L.elem[i];
L.elem[i]=t;
}
}
}
int main()
{
SqList La,Lb,Lc;
printf("请输入La,Lb预计的元素个数:\n");
scanf("%d %d",&La.length,&Lb.length);
InitList(La);
InitList(Lb);
CreateList(La,1);
CreateList(Lb,2);
printf("目前线性表La元素是:\n");
pailie(La);
output(La);
printf("\n目前线性表Lb元素是:\n");
pailie(La);
output(Lb);
MergeList(La,Lb,Lc);
printf("\n合并后Lc中元素是:\n");
output(Lc);
return 0;
}