第一关:创建空顺序线性表
任务描述
本关要求按照完成顺序表数据类型定义,并初始化一个顺序线性表。
编程要求
顺序线性表数据结构定义如下: typedef int DataType; struct seqList { int MAXNUM;//用于记录顺序线性表中能存放的最大元素个数的 整型 MAXNUM int curNum;//用于存放顺序线性表中数据元素的个数 整型 curNum DataType *element;//用于存放顺序线性表数据元素的连续空间的起始地址
本关的编程任务是补全文件中
createNullList_seq
函数,以实现初始化一个空的顺序线
第一关主函数
int main(void)
{
int m;
scanf("%d",&m);
PseqList head = createNullList_seq(m);
if(head == NULL)
printf("fail to create");
else
printf("success to create a seqlist of %d elements,current item %d",m,head->curNum);
}
第二关:顺序线性表的插入
任务描述
本关任务: 你需要实现不同的插入操作: 在顺序线性表中下标为p位置、p位置之前、p位置之后插入数据元素
编程要求
为了实现线性表插入操作,你需要实现判断线性表是否为满的判断函数,另外你需要根据提示,在右侧编辑器补充代码,完成操作insertP_seq,insertPre_seq,insertPost_seq三个插入函数,以及遍历输出线性表数据元素的操作printList_seq。具体说明见操作注释。
第二关主函数
int main(void)
{
int m ,x;
scanf("%d",&m);
PseqList head = createNullList_seq(m);
for(int i=0;i<m/2;i++)
{
scanf("%d",&x);
insertP_seq(head,i,x);
}
for(int i=0;i<m/2;i++)
{
scanf("%d",&x);
insertPre_seq(head,i,x);
insertPost_seq(head,i,x);
}
printList_seq(head);
}
第三关:销毁线性表
任务描述
本关任务:销毁线性表的实质时实现动态分配的线性表空间回收。
相关知识
使用malloc函数分配的内存空间应该在程序退出时使用free将空间回收还给操作系统。 由于顺序线性表创建时使用了malloc为线性表结构、线性表数据元素动态分配了存储空间,我们应使用free将相应空间回收。
编程要求
根据提示,在右侧编辑器补充代码,实现销毁线性表的功能。
第三关主函数
int main(void)
{
int m ,x;
scanf("%d",&m);
PseqList head = createNullList_seq(m);
for(int i=0;i<m;i++)
{
scanf("%d",&x);
insertP_seq(head,i,x);
}
printf("%d", destroyList_seq(head));
}
第四关:查找
本关任务:
1.在顺序线性表中查找第一个值为x的元素下标。
2.在顺序线性表中查找某个位置pos处的数据元素
第四关主函数
int main(void)
{
int m ,x;
scanf("%d",&m);
PseqList head = createNullList_seq(m);
for(int i=0;i<m;i++)
{
scanf("%d",&x);
insertP_seq(head,i,x);
}
scanf("%d",&m);
printf("%d\n",locatePos_seq(head,m));
printf("%d\n",locate_seq(head,m));
destroyList_seq(head);
}
第五关:删除
任务描述
本关任务: (1)在顺序表L中删除下标pos处的数据元素 (2)在顺序表L中删除与参数x值相同的数据元素
编程要求
根据提示,在右侧编辑器补充第五关的代码。
第五关主函数
int main(void)
{
int m ,x;
scanf("%d",&m);
PseqList head = createNullList_seq(m);
for(int i=0;i<m;i++)
{
scanf("%d",&x);
insertP_seq(head,i,x);
}
scanf("%d",&m);
printf("%d\n",deletePos_seq(head,m));
scanf("%d",&m);
printf("%d\n",delete_seq(head,m));
printList_seq(head);
destroyList_seq(head);
}
第六关:顺序表的应用
任务描述
本关任务: (1)使用将顺序表L中值为x的数据元素替换为y; (2)此处假设线性表中的元素用于表示集合,不考虑线性表中元素的位置,移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
编程要求
根据提示,在右侧编辑器补充代码,完成第六关的两个函数。
第六关主函数
int main(void)
{
int m ,x;
scanf("%d",&m);
PseqList head = createNullList_seq(m);
for(int i=0;i<m;i++)
{
scanf("%d",&x);
insertP_seq(head,i,x);
}
scanf("%d%d",&m,&x);
replace_seq(head,m,x);
delDuplicate_seq(head);
printList_seq(head);
destroyList_seq(head);
}
头文件,全局函数
#include <stdio.h>
#include <stdlib.h>
/*此处是顺序线性表数据结构定义*/
typedef int DataType;
struct seqList
{//有3个数据成员
int MAXNUM;//用于记录顺序线性表中能存放的最大元素个数的 整型 MAXNUM
int curNum;//用于存放顺序线性表中数据元素的个数 整型 curNum
DataType *element;//用于存放顺序线性表数据元素的连续空间的起始地址
};
typedef struct seqList *PseqList;
//第一关
PseqList createNullList_seq(int m)
{//此处填写代码,创建一个空的顺序线性表,能存放的最大元素个数为 m
//若m=0,则返回NULL
if(m==0)return NULL;
else{
PseqList seqList = (PseqList)malloc(sizeof(struct seqList));
seqList->MAXNUM = m;
seqList->curNum = 0;
seqList->element = (int *)malloc(m*sizeof(int));
return seqList;
}
}
//第二关
int isFullList_seq(PseqList L)
{
//判断顺序线性表是否已满,若已满,返回值为1,否则返回值为0
if(L->curNum==(L->MAXNUM)-1) return 1;
else return 0;
}
int insertP_seq(PseqList L , int p ,int x)
{// 在线性表L中下标为p的位置插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//如果线性表满了, 还需输"list is full"的提示
//如果插入位置非法,需输出提示"position is illegel"
if(L->curNum>=L->MAXNUM){
printf("list is full");
return 0;
}else if(L->curNum<p||p<0){
printf("position is illegel");
return 0;
}else{
for(int q = L->curNum-1;q>=p;q--){
L->element[q+1] = L->element[q];
}
L->element[p] = x;
L->curNum = L->curNum+1;
return 1;
}
}
int insertPre_seq(PseqList L , int p ,int x)
{
// 在线性表L中下标为p的位置的前面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可
return insertP_seq(L,p-1,x);
}
int insertPost_seq(PseqList L , int p ,int x)
{
// 在线性表L中下标为p的位置的后面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可
return insertP_seq(L,p+1,x);
}
void printList_seq(PseqList L)
{//逐个输出线性表的元素,相邻的两个数据元素之间以一个空格为分隔符隔开
for(int i=0;i<L->curNum;i++){
printf("%d ",L->element[i]);
}
}
//第三关
int destroyList_seq(PseqList L)
{
//返回值为销毁的线性表中现有数据元素的个数,若待销毁的线性表不存在,则返回0
if(L==NULL)return 0;
free(L->element);
return L->curNum;
}
//第四关
int locate_seq(PseqList L,int x)
{//在顺序表L中查找给定值x首次出现的位置,若不存在给定值,则返回-1
for(int i = 0;i<L->curNum;i++){
if(L->element[i]==x){
return i;
}
}
return -1;
}
DataType locatePos_seq(PseqList L,int pos)
{// 在顺序表L中查找指定位置pos处的数据元素,若位置非法,则返回第0个数据元素
if(pos>L->curNum||pos<0) return L->element[0];
return L->element[pos];
}
//第五关
int deletePos_seq(PseqList L,int pos)
{//在顺序表L中删除与下标pos处的数据元素,若pos非法,则返回-1;否则返回1
if(pos>L->curNum||pos<0) return -1;
for(int i = pos;i<L->curNum;i++){
L->element[i] = L->element[i+1];
}
L->curNum = L->curNum - 1;
return 1;
}
int delete_seq(PseqList L,int x)
{//在顺序表L中删除与参数x值相同的数据元素,返回删除数据元素的个数
//可以使用之前已完成的操作
int count = 0;
for(int i = 0;i<L->curNum;i++){
if(L->element[i]==x){
for(int j = i;j<L->curNum;j++){
L->element[j]=L->element[j+1];
}
count++;
L->curNum = L->curNum-1;
}
}
return count;
}
//第六关
void replace_seq(PseqList L,int x,int y)
{//将顺序表L中值为x的数据元素替换为y
for(int i=0;i<=L->curNum;i++){
if(L->element[i]==x) L->element[i]=y;
}
}
void delDuplicate_seq(PseqList L)
{//移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成
//使用常规删除即可,已修改测试用例
for(int i = 0;i<L->curNum;i++){
int temp = L->element[i];
int flag = 0;
for(int j = i+1;j<=L->curNum;j++){
if(temp==L->element[j]){
for(int k = j;k<L->curNum;k++){
L->element[k] = L->element[k+1];
}
L->curNum = L->curNum-1;
flag = 1;
}
}
if(flag){
for(int j = i;j<L->curNum;j++){
L->element[j]=L->element[j+1];
}
L->curNum = L->curNum-1;
}
}
}