已知顺序表结构和相关函数定义如下(详见sequlist.h文件),基于该文件完成实验题1~实验题5。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int size;
}sequence_list;
/***************************/
/*函数名称:initseqlist() */
/*函数功能:初始化顺序表 */
/***************************/
void initseqlist(sequence_list *L)
{
L->size=0;
}
/***************************/
/*函数名称:input() */
/*函数功能:输入顺序表 */
/***************************/
void input(sequence_list *L)
{
datatype x;
initseqlist(L);
printf("请输入一组数据,以0作为结束符:\n");
scanf("%d",&x);
while(x)
{
L->a[L->size++]=x;
scanf("%d",&x);
}
}
/***************************/
/*函数名称:inputfromfile() */
/*函数功能:从文件输入顺序表*/
/***************************/
void inputfromfile(sequence_list *L,char *f)
{
int i,x;
FILE *fp=fopen(f,"r");
L->size=0;
if(fp)
{
while(!feof(fp))
{
fscanf(fp,"%d",&L->a[L->size++]);
}
fclose(fp);
}
}
/***************************/
/*函数名称:print() */
/*函数功能:输出顺序表 */
/***************************/
void inputfromfile(sequence_list *L,char *f)
{
int i,x;
FILE *fp=fopen(f,"r");
L->size=0;
if(fp)
{
while(!feof(fp))
{
fscanf(fp,"%d",&L->a[L->size++]);
}
fclose(fp);
}
}
(1)基于sequlist.h中定义的顺序表,编写算法函数reserve(sequence_list *L),实现顺序表的倒置
(1)#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int size;
}sequence_list;
void initseqlist(sequence_list *L)
{
L->size=0;
}
void input(sequence_list *L)
{
datatype x;
initseqlist(L);
printf("请输入一组数据,以0作为结束符:\n");
scanf("%d",&x);
while(x)
{
L->a[L->size++]=x;
scanf("%d",&x);
}
}
/*void inputfromfile(sequence_list *L,char *f)
{
int i,x;
FILE *fp=fopen(f,"r");
}*/
void print(sequence_list *L)
{
int i;
for(i=0;i<L->size;i++)
{
printf("%5d",L->a[i]);
if((i+1)%10==0) printf("\n");
}
printf("\n");
}
void reserve(sequence_list *L)
{
int left,right,temp;
int i;
for(left=0,right=L->size-1;left<=right;left++,right--)
{
temp=L->a[left];
L->a[left]=L->a[right];
L->a[right]=temp;
}
}
int main()
{
sequence_list L;
input(&L);
print(&L);
reserve(&L);
print(&L);
}
(2)编写一个算法函数void sprit(sequence_list *L1, sequence_list *L2, sequence_list *L3),将顺序表L1中的数据进行分类,奇数存放到顺序表L2中,偶数存放到顺序表L3中,编写main()函数进行测试
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int size;
}sequence_list;
void initseqlist(sequence_list *L)
{
L->size=0;
}
void input(sequence_list *L)
{
datatype x;
initseqlist(L);
printf("请输入一组数据,以0作为结束符:\n");
scanf("%d",&x);
while(x)
{
L->a[L->size++]=x;
scanf("%d",&x);
}
}
/*void inputfromfile(sequence_list *L,char *f)
{
int i,x;
FILE *fp=fopen(f,"r");
}*/
void print(sequence_list *L)
{
int i;
for(i=0;i<L->size;i++)
{
printf("%5d",L->a[i]);
if((i+1)%10==0) printf("\n");
}
printf("\n");
}
void sprit(sequence_list *L1,sequence_list *L2,sequence_list *L3)
{
int i,j,k;
j=k=0;
L2->size=0;
L3->size=0;
for(i=0;i<=L1->size-1;i++)
{
if(L1->a[i]%2==0)
{
L3->a[L3->size]=L1->a[i];
L3->size=L3->size+1;
}
else
{
L2->a[L2->size]=L1->a[i];
L2->size=L2->size+1;
}
}
}
int main()
{
sequence_list L1,L2,L3;
input(&L1);
sprit(&L1,&L2,&L3);
print(&L1);
print(&L2);
print(&L3);
}
(3)已知顺序表L1和L2中的数据均由小到大排序,请用尽可能快的方法将L1和L2中的数据合并到L3中,使数据在L3中按升序排列。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int size;
}sequence_list;
void initseqlist(sequence_list *L)
{
L->size=0;
}
void input(sequence_list *L)
{
datatype x;
initseqlist(L);
printf("请输入一组数据,以0作为结束符:\n");
scanf("%d",&x);
while(x)
{
L->a[L->size++]=x;
scanf("%d",&x);
}
}
/*void inputfromfile(sequence_list *L,char *f)
{
int i,x;
FILE *fp=fopen(f,"r");
}*/
void print(sequence_list *L)
{
int i;
for(i=0;i<L->size;i++)
{
printf("%5d",L->a[i]);
if((i+1)%10==0) printf("\n");
}
printf("\n");
}
void merge(sequence_list *L1,sequence_list *L2,sequence_list *L3)
{
int i,j;
L3->size=0;
for(i=0;i<L1->size;i++)
{
L3->a[L3->size]=L1->a[i];
L3->size=L3->size+1;
}
for(i=0,j=L3->size;i<L2->size;i++,j++)
{
L3->a[j]=L2->a[i];
L3->size=L3->size+1;
}
int temp,minindex;
for(i=0;i<L3->size-1;i++)
{
minindex=i;
for(j=i+1;j<L3->size;j++)
if(L3->a[j]<L3->a[minindex])
minindex=j;
if(minindex!=i)
{
temp=L3->a[i];
L3->a[i]=L3->a[minindex];
L3->a[minindex]=temp;
}
}
}
int main()
{
sequence_list L1,L2,L3;
input(&L1);
input(&L2);
merge(&L1,&L2,&L3);
print(&L3);
}
4)假设顺序表la与lb分别存放两个整数集合,函数inter(sequence_list *la, sequence_list *lb, sequence_list *lc)的功能是将顺序表la和lb的交集放到顺序表lc中,请将函数补充完整。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int size;
}sequence_list;
/*void initseqlist(sequence_list *L)
{
L->size=0;
}
void input(sequence_list *L)
{
datatype x;
initseqlist(L);
printf("请输入一组数据,以0作为结束符:\n");
scanf("%d",&x);
while(x)
{
L->a[L->size++]=x;
scanf("%d",&x);
}
}*/
/*void inputfromfile(sequence_list *L,char *f)
{
int i,x;
FILE *fp=fopen(f,"r");
L->size=0;
if(fp)
{
while(!feof(fp))
{
fscanf(fp,"%d",&L->a[L->size++]);
}
fclose(fp);
}
}*/
void inputfromfile(sequence_list *L,char *f)
{
int i,x;
FILE *fp=fopen(f,"r");
L->size=0;
if(fp)
{
while(!feof(fp))
{
fscanf(fp,"%d",&L->a[L->size++]);
}
fclose(fp);
}
}
void print(sequence_list *L)
{
int i;
for(i=0;i<L->size;i++)
{
printf("%5d",L->a[i]);
if((i+1)%10==0) printf("\n");
}
printf("\n");
}
void inter(sequence_list *la,sequence_list *lb,sequence_list *lc)
{
lc->size=0;
int i,j;
for(i=0;i<la->size;i++)
{
for(j=0;j<lb->size;j++)
{
if(la->a[i]==lb->a[j])
{
lc->a[lc->size]=la->a[i];
lc->size=lc->size+1;
}
}
}
}
int main()
{
sequence_list la,lb,lc;
inputfromfile(&la,"1.txt");
inputfromfile(&lb,"2.txt");
print(&la);
print(&lb);
inter(&la,&lb,&lc);
print(&lc);
return 0;
}
(5)请编写一个算法函数partion(sequence_list *L),尽可能快地将顺序表*L中的所有奇数调整到表的左边,所有偶数调整到表的右边,并分析算法的时间复杂度。
#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100
typedef int datatype;
typedef struct{
datatype a[MAXSIZE];
int size;
}sequence_list;
/*void initseqlist(sequence_list *L)
{
L->size=0;
}
void input(sequence_list *L)
{
datatype x;
initseqlist(L);
printf("请输入一组数据,以0作为结束符:\n");
scanf("%d",&x);
while(x)
{
L->a[L->size++]=x;
scanf("%d",&x);
}
}*/
/*void inputfromfile(sequence_list *L,char *f)
{
int i,x;
FILE *fp=fopen(f,"r");
L->size=0;
if(fp)
{
while(!feof(fp))
{
fscanf(fp,"%d",&L->a[L->size++]);
}
fclose(fp);
}
}*/
void inputfromfile(sequence_list *L,char *f)
{
int i,x;
FILE *fp=fopen(f,"r");
L->size=0;
if(fp)
{
while(!feof(fp))
{
fscanf(fp,"%d",&L->a[L->size++]);
}
fclose(fp);
}
}
void print(sequence_list *L)
{
int i;
for(i=0;i<L->size;i++)
{
printf("%5d",L->a[i]);
if((i+1)%10==0) printf("\n");
}
printf("\n");
}
void partion(sequence_list *L)
{
int i,j,temp,index;
for(i=0;i<L->size-1;i++)
{
index=i;
for(j=i+1;j<L->size;j++)
{
if(L->a[i]%2==0&&L->a[j]!=0)
{
index=j;
temp=L->a[i];
L->a[i]=L->a[index];
L->a[index]=temp;
}
}
}
}
int main()
{
sequence_list L;
inputfromfile(&L,"3.txt");
print(&L);
partion(&L);
print(&L);
return 0;
}