第1关:创建空顺序线性表
本关要求按照完成顺序表数据类型定义,并初始化一个顺序线性表。
第2关:顺序线性表插入
你需要实现不同的插入操作:
在顺序线性表中下标为p位置、p位置之前、p位置之后插入数据元素
第3关:销毁线性表
销毁线性表的实质时实现动态分配的线性表空间回收。
第4关:查找
1.在顺序线性表中查找第一个值为x的元素下标。
2.在顺序线性表中查找某个位置pos处的数据元素
第5关:删除
(1)在顺序表L中删除下标pos处的数据元素
(2)在顺序表L中删除与参数x值相同的数据元素
第6关:顺序表应用
(1)使用将顺序表L中值为x的数据元素替换为y;
(2)此处假设线性表中的元素用于表示集合,不考虑线性表中元素的位置,移除线性表中的所有重复元素;不要使用额外的数组空间,必须在原地修改输入数组 并在使用 O(1) 额外空间的条件下完成。
上面六关的代码答案都是下面的同一个哦!
#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
PseqList plist = (PseqList)malloc(sizeof(struct seqList));
if(plist == NULL||m==0)
return NULL; //分配空间失败
plist->MAXNUM = m ;
plist->curNum = 0;
plist->element = (DataType *)malloc(sizeof(DataType)*m);
if(plist->element == NULL)
{
free(plist);
return NULL;
}
return plist;
}
//第二关
int isFullList_seq(PseqList L)
{
//判断顺序线性表是否已满,若已满,返回值为1,否则返回值为0
if(L->MAXNUM == L->curNum)
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;
}
if(p >= L->curNum + 1 || p < 0)
{
printf("position is illegel");
return 0;
}
for (int i = L->curNum; i >= p + 1 ; i --)
{
L->element[i] = L->element[i - 1];
}
L->element[p] = x;
L->curNum++;
return 1;
}
int insertPre_seq(PseqList L , int p ,int x)
{
//在线性表L中下标为p的位置的前面(即下标为p-1的位置)插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可
insertP_seq(L , p - 1 ,x);
}
int insertPost_seq(PseqList L , int p ,int x)
{
// 在线性表L中下标为p的位置的后面插入数据元素x,若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
//提示:直接调用insertP函数实现即可
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;
else
{
int m = L->curNum;
free(L->element);
free(L);
return m;
}
}
//第四关
int locate_seq(PseqList L,int x)
{//在顺序表L中查找给定值x首次出现的位置,若不存在给定值,则返回-1
int i = 0;
for(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 < 0 || pos >= L->curNum) return L->element[0];
return L->element[pos];
}
//第五关
int deletePos_seq(PseqList L,int pos)
{//在顺序表L中删除与下标pos处的数据元素,若pos非法,则返回-1;否则返回1
int i = 0;
if(pos < 0 || pos >= L->curNum) return -1;
for(i = pos; i < L->curNum - 1; i ++)
L->element[i] = L->element[i + 1];
L->curNum--;
return 1;
}
int delete_seq(PseqList L,int x)
{//在顺序表L中删除与参数x值相同的数据元素,返回删除数据元素的个数
//可以使用之前已完成的操作
int cnt = 0,num = L->curNum;
int i = 0, r = 0;
for(i = 0; i < num; i ++)
{
if(L->element[i] != x)
{
L->element[r] = L->element[i];
r++;
}
else
L->curNum--,cnt++;
}
return cnt;
}
//第六关
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;){
int ret=1;
for(int j=i+1;j<L->curNum;j++){
if(L->element[j]==L->element[i]){
delete_seq(L,L->element[i]); // 删除所有值为 element[i]的元素
ret=0;
break;
}
}
if(ret){
i++; // 如果 位置 i上的元素不是重复值,则跳到下一个index。如果是重复值,则不用跳到下一索引,因为删除操作会自动移位。
}
}
}