# 数据结构——顺序表的基本操作

1 篇文章 0 订阅

### 函数接口定义：

Status ListInsert_Sq(SqList &L, int pos, ElemType e);
Status ListDelete_Sq(SqList &L, int pos, ElemType &e);
int ListLocate_Sq(SqList L, ElemType e);
void ListPrint_Sq(SqList L);


### 裁判测试程序样例：


//库函数头文件包含
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

//函数状态码定义
#define TRUE        1
#define FALSE       0
#define OK          1
#define ERROR       0
#define INFEASIBLE -1
#define OVERFLOW   -2

typedef int  Status;

//顺序表的存储结构定义
#define LIST_INIT_SIZE  100
#define LISTINCREMENT   10
typedef int ElemType;  //假设线性表中的元素均为整型
typedef struct{
ElemType* elem;   //存储空间基地址
int length;       //表中元素的个数
int listsize;     //表容量大小
}SqList;    //顺序表类型定义
Status ListInsert_Sq(SqList &L, int pos, ElemType e);
Status ListDelete_Sq(SqList &L, int pos, ElemType &e);
int ListLocate_Sq(SqList L, ElemType e);
void ListPrint_Sq(SqList L);

//结构初始化与销毁操作
Status InitList_Sq(SqList &L){
//初始化L为一个空的有序顺序表
L.elem=(ElemType *)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(!L.elem)exit(OVERFLOW);
L.listsize=LIST_INIT_SIZE;
L.length=0;
return OK;
}

int main() {
SqList L;

if(InitList_Sq(L)!= OK) {
printf("InitList_Sq: 初始化失败！！！\n");
return -1;
}

for(int i = 1; i <= 10; ++ i)
ListInsert_Sq(L, i, i);

int operationNumber;  //操作次数
scanf("%d", &operationNumber);

while(operationNumber != 0) {
int operationType;  //操作种类
scanf("%d", & operationType);

if(operationType == 1) {  //增加操作
int pos, elem;
scanf("%d%d", &pos, &elem);
ListInsert_Sq(L, pos, elem);
} else if(operationType == 2) {  //删除操作
int pos; ElemType elem;
scanf("%d", &pos);
ListDelete_Sq(L, pos, elem);
printf("%d\n", elem);
} else if(operationType == 3) {  //查找定位操作
ElemType elem;
scanf("%d", &elem);
int pos = ListLocate_Sq(L, elem);
if(pos >= 1 && pos <= L.length)
printf("%d\n", pos);
else
printf("NOT FIND!\n");
} else if(operationType == 4) {  //输出操作
ListPrint_Sq(L);
}
operationNumber--;
}
return 0;
}

/* 请在这里填写答案 */


### 输入样例：

4
1 1 11
2 2
3 3
4


### 输出样例：

1
3
11 2 3 4 5 6 7 8 9 10

#define LIST_INIT_SIZE  100

Status ListInsert_Sq(SqList &L, int pos, ElemType e)
{
ElemType *newbase;//定义扩容后的首地址
if(pos >= 1&&pos <= L.length + 1)//判断给的pos是否在L.length的范围之内
{
if(L.length >=  L.listsize)//如果L.length已经达到或超出设定值，需要扩容
{
newbase = (ElemType *)realloc(L.elem,(L.listsize+LISTINCREMENT) * sizeof(ElemType));//给newbase动态分配一个长度为LISTINCREMENT的新空间
if(!newbase)//如果分配失败则返回错误
return ERROR;
L.elem = newbase;//新分配空间的基地址
L.listsize += LISTINCREMENT;//现在的空间长的等于原来空间长度加上新分配的空间长度

}
ElemType *p,*q;
p = &(L.elem[pos - 1]);//将原来pos位置元素的地址分配给指针p
for(q = &(L.elem[L.length - 1]);q >= p;--q)
{
*(q + 1) = *q;
}//将原来顺序表最后一个位置数据的地址分配给q，然后从后往前依次将数据向后移动一位
*p = e;//将数据e放到pos位置
++L.length;//顺序表的长度要加一
return OK;
}
else
return OVERFLOW;
}

Status ListDelete_Sq(SqList &L, int pos, ElemType &e)
{
if(pos >= 1&&pos <= L.length)//判断pos是否在顺序表的长度之内
{
ElemType *q;
e = L.elem[pos - 1];//先将e赋值，也就是返回删掉了哪个数
for(q = &(L.elem[pos - 1]);q <=&(L.elem[L.length - 1]);++q)
{
*q = *(q + 1);
}//将pos位置以后的元素依次向前移动一位
L.length = L.length - 1;//L的长度要减一
}
else
return OVERFLOW;
}

int ListLocate_Sq(SqList L, ElemType e)
{
int a = -1;//给a赋初值，无论查找的数据在第几个，都不可能是第-1个，所以赋值-1
for(int i = 0;i <= L.length -1;i++)
{
if(L.elem[i] == e)
{
a = i;
break;
}
}//for循环进行查找
if(a >= 0&&a <= L.length -1)
return a + 1;//如果a的值满足要求，则返回a
else
return ERROR;//如果a不满足，则返回错误。
}

void ListPrint_Sq(SqList L)
{
for(int i = 0;i <= L.length - 2;i++)
{
printf("%d ",L.elem[i]);
}
printf("%d",L.elem[L.length -1]);

}




• 17
点赞
• 1
评论
• 48
收藏
• 一键三连
• 扫一扫，分享海报

11-22
09-18

09-13 9万+
05-03 7万+
04-21 1万+
04-05 2651
07-30 373
02-01 262
10-02 213
07-23 8444
03-31 106
12-10 3764
04-26 1267
05-25 1349