#include <stdio.h>
#include "malloc.h"
#define OVERFLOW -2
#define INITSIZE 10
#define LISTINCREMENT 10
typedef int ElemType;
typedef struct
{
int sno;
float score;
} Student;
typedef struct
{
Student *Stu;
ElemType *data;
int Length;
int ListSize;
} SqList;
SqList La,Lb,Lc,S;
int initlist(SqList *L)
{
//初始化顺序表
L->data= (ElemType*) malloc (INITSIZE*sizeof(ElemType) );
if (L->data==NULL) //分配空间失败
return 0;
L-> Length=0; //分配成功,把表长赋值为0,即创建一个空表
L->ListSize=INITSIZE;
return 1 ;
}
void MenuList()
{
printf("\n\n\n**************************\n");
printf(" 1 ------- 初始化顺序表\n");
printf(" 2 ------- 生成顺序表La\n");
printf(" 3 ------- 输出顺序表中的元素 \n");
printf(" 4 ------- 向顺序表中插入元素\n");
printf(" 5 ------- 删除顺序表中的元素 \n");
printf(" 6 ------- 查找顺序表中值为X的元素 \n");
printf(" 7 ------- 将顺序表置空 \n");
printf(" 8 ------- 合并两个有序顺序表 \n");
printf(" 9 ------- 将顺序表中的元素倒置 \n");
printf(" 10 ------- 删除顺序表中值为x的所有元素 \n");
printf(" 11 ------- 求两个顺序表的交集 \n");
printf(" 12 ------- 建立学生顺序表 \n");
printf(" 0 ------- 退出 \n");
printf("**************************\n");
}
void Init(SqList *L,int i)
{
//生成顺序表,即向初始化的空顺序表中插入元素
int j=0 ;
ElemType e;
ElemType *p;
p=L->data;
while (j<i)
{
//依次输入元素
scanf("%d",&e);//输入一个元素值后回车
*(p+j)=e;//或者写成:p[j]=e;
j++;
}
L->Length=i;
}
void printsq(SqList *L)
{
//输出顺序表中所有元素
int i;
printf("Size=%d Length=%d \n",L->ListSize,L->Length);
for (i=0; i<L->Length; i++)
printf("第%d 个元素为: %d\n",i+1,L->data[i]);
}
int ListInsert(SqList *L,int i,int e)//插入
{
ElemType *newbase,j;
if(i<1||i>L->Length+1)
return 0;
if(L->Length==L->ListSize)
{
//空间不够,分配空间
newbase=(ElemType *)realloc(L->data,(L->ListSize+LISTINCREMENT)*sizeof(ElemType));
if(!newbase)//分配失败
return 1;
L->data=newbase;
L->ListSize+=LISTINCREMENT;
}
for(j=L->Length-1; j>=i-1; j--)
L->data[j+1]=L->data[j];//将线性表第i个元素之后的所有元素向后移动
L->data[i-1]=e;//将新元素放在线性表的第i个位置
L->Length++;//表长加一
return 2;
}
int Listdelete(SqList *L,int i)//删除顺序表中第i个元素
{
if(L->Length==0)
return 0;
int j;
if(i<1||i>L->Length)
return 1;
for(j=i; j<L->Length; j++)
L->data[j-1]=L->data[j];//将线性第i+1个元素之后的所有元素向前移动
L->Length--;
return 2;
}
int Listfind(SqList *L,int x)
{
// 查找值为x的元素
int i;
for(i=0; i<L->Length; i++)
{
if(L->data[i]==x)
return i+1;//返回值为x的元素在线性表中的位置
}
return 0;
}
int delx(SqList *L,int x)
{
// 删除值为x的所有元素
if(L->Length==0)
return 0;
int i,j=0;
for(i=0; i<L->Length;i++)
if(L->data[i]==x)
j++;
else
L->data[i-j]=L->data[i];
L->Length=L->Length-j;
return 1;
}
int TList( SqList *L)
{
//将顺序表中的元素倒置
int i;
ElemType t;
for(i=0; i<L->Length/2; i++)
{
t=L->data[i];
L->data[i]=L->data[L->Length-i-1];
L->data[L->Length-i-1]=t;
}
return 1;
}
int MList( SqList *La,SqList *Lb,SqList *Lc)
{
//合并两个有序顺序表
ElemType* pa=La->data;//指针pa指向La的首元素
ElemType* pb=Lb->data;
Lc->Length=La->Length+Lb->Length;
ElemType* pc=Lc->data;
ElemType* pa_last=La->data+La->Length-1;
ElemType* pb_last=Lb->data+Lb->Length-1;
while(pa<=pa_last&&pb<=pb_last)
{
if(*pa>*pb)
*pc++=*pa++;
else if(*pa<*pb)*pc++=*pb++;
else{
*pc++=*pa++;
*pb++;
Lc->Length--;
}
}
while(pa<=pa_last)
*pc++=*pa++;//当Lb已经到达表尾,而La还没到达表尾时
while(pb<=pb_last)
*pc++=*pb++;//当La已经到达表尾,而Lb还没到达表尾时
return 1;
}
int RList( SqList *La,SqList *Lb)
{
//求两个有序表的交集
int i,e,j=0;
for(i=0; i<Lb->Length; i++)
{
//e=Lb->data[i];
// if(!Listfind(La,e)){
if(La->data[j]<Lb->data[i]) {
e = Lb->data[i];
delx(Lb, e);
i--;
}
else if(La->data[j]==Lb->data[i])
j++;
else{
j++;
i--;
}
}
return 1;
}
int Create( SqList *L){
int i;
for(i=0;;i++)
{
printf("请输入学生的信息:\n");
printf("学号:") ;
scanf("%d",&L->Stu[i].sno) ;
if(L->Stu[i].sno==0)
return 1;
printf("成绩:") ;
scanf("%f",&L->Stu[i].score) ;
L->Length++;
}
}
int main()
{
int s,m=100,f,q;
while (m!=0)
{
MenuList();
printf("请输入菜单中的功能选项编号:" );
scanf("%d",&m);
if (m==1)
{
s= initlist(&La);
if (s==0)
printf("La空间申请失败");
else
printf("La空间申请成功");
}
if (m==2 )
{
printf("请输入线性表中的元素个数:");
scanf("%d",&f);
Init(&La,f);
}
if (m==3) printsq(&La) ;
if (m==4)
{
printf("请输入插入位置:");
scanf("%d",&f);
printf("请输入插入元素:");
scanf("%d",&q);
s=ListInsert(&La,f,q);
if (s==0)
printf("插入位置不合法");
else if(s==1)
printf("新分配空间失败");
else {
printf("插入成功\n");
printsq(&La);
}
}
if (m==5)
{
printf("请输入删除位置:");
scanf("%d",&f);
s=Listdelete(&La,f);
if (s==0)
printf("表为空,无法执行删除操作");
else if(s==1)
printf("删除位置不合法");
else
printf("删除成功\n");
printsq(&La);
}
if (m==6)
{
printf("请输入查找元素的值:");
scanf("%d",&f);
s=Listfind(&La,f);
if (s==0)
printf("线性表中不存在值为%d的元素",f);
else
printf("值为%d的元素在线性表中的位置为%d",f,s);
}
if (m==7)
{
s= initlist(&La);
if (s==0)
printf("线性表置空失败");
else
printf("线性表置空成功");
printsq(&La);
}
if (m==8)
{
initlist(&Lb);
printf("请输入Lb中的元素个数:");
scanf("%d",&f);
Init(&Lb,f);
initlist(&Lc);
s=MList(&La,&Lb,&Lc);
if(s==1){
printf("合并成功,合并后的结果为:\n");
printsq(&Lc);}
else
printf("合并失败");
}
if (m==9)
{
s=TList(&La);
if(s==1) {
printf("倒置成功\n");
printsq(&La);
}
else
printf("倒置失败");
}
if(m==10)
{
printf("请输入需要删除元素的值:");
scanf("%d",&f);
s=delx(&La,f);
if (s==0)
printf("表为空,无法执行删除操作");
else
printf("删除成功\n");
printsq(&La);
}
if(m==11)
{
initlist(&Lb);
printf("请输入Lb中的元素个数:");
scanf("%d",&f);
Init(&Lb,f);
s=RList(&La,&Lb);
if(s==1)
{
printf("操作成功,取交集后的结果为:\n");
printsq(&Lb);
}
}
if(m==12)
{
S.Stu= (Student*) malloc (INITSIZE*sizeof(Student) );
if (S.Stu==NULL) //分配空间失败
return 0;
S.Length=0; //分配成功,把表长赋值为0,即创建一个空表
S.ListSize=INITSIZE;
s=Create(&S);
if(s==1)
{
int i;
printf("创建成功!\n学生信息表为:\n");
printf("Size=%d Length=%d \n",S.ListSize,S.Length);
printf("---------------------\n");
for (i=0; i<S.Length; i++){
printf("学号:%d |",S.Stu[i].sno);
printf(" 成绩:%.1f\n",S.Stu[i].score);
printf("---------------------\n");
}
}
}
}
return 0;
}
代码-线性表
于 2022-08-15 18:29:30 首次发布