PTA中的“顺序表操作集”代码

  这里引起我注意的点是创建空表的时候,保存最后一个元素位置的变量需要设置为-1,我刚开始疏忽了

  这里的题目集是“数据结构与算法题目集”,原题是只让写操作函数的,为了大家参考方便,我直接把所有的代码放上来了。

代码:

#include <stdio.h>
#include <stdlib.h>

#define MAXSIZE 5
#define ERROR -1
//typedef enum {false, true} bool;
typedef int ElementType;
typedef int Position;
typedef struct LNode *List;
struct LNode {
ElementType Data[MAXSIZE];
Position Last; /* 保存线性表中最后一个元素的位置 */
};

List MakeEmpty();
Position Find( List L, ElementType X );
bool Insert( List L, ElementType X, Position P );
bool Delete( List L, Position P );

int main() {
List L;
ElementType X;
Position P;
int N;

L = MakeEmpty();
scanf("%d", &N);
while ( N-- ) {
scanf("%d", &X);
if ( Insert(L, X, 0)==false )
printf(" Insertion Error: %d is not in.\n", X);
}
scanf("%d", &N);
while ( N-- ) {
scanf("%d", &X);
P = Find(L, X);
if ( P == ERROR )
printf("Finding Error: %d is not in.\n", X);
else
printf("%d is at position %d.\n", X, P);
}
scanf("%d", &N);
while ( N-- ) {
scanf("%d", &P);
if ( Delete(L, P)==false )
printf(" Deletion Error.\n");
if ( Insert(L, 0, P)==false )
printf(" Insertion Error: 0 is not in.\n");
}
return 0;
}

/* 你的代码将被嵌在这里 */

//创建一个空的顺序表
List MakeEmpty() {
//定义空指针
List L;

//分配空间
L = (List)malloc(sizeof(struct LNode));

//初始化
L->Last = -1;

//返回
return L;
}

//创建顺序表查找函数
Position Find( List L, ElementType X ) {
//采用挨个对比的方式进行查找

for(int i = 0; i<=L->Last; i++) {
//进行对比,如果找到了就返回下标
if(L->Data[i] == X) {
return i;
}
}

//如果能够顺利循环结束就说明没有找到
return ERROR;
}


bool Insert( List L, ElementType X, Position P ) {
//首先判断顺序表是否已满,如果已满,那么输出FULL并返回false
//然后判断参数P指向的位置,如果是非法的,那么打印ILLEGAL POSITION并返回false
//如果以上没有问题,那么将P所指向位置及其后面的元素向后挪一位,腾出空间
//然后将待插入元素插入进去

//判断是否满了
if(L->Last == (MAXSIZE-1)) {
printf("FULL");
return false;
}

//判断P指向的位置,如果P指向的位置在0到当前末尾下标+1的闭区间内,那么就是合法的
//否则就是非法的
if(!((P>=0)&&(P<=(L->Last+1)))) {
//如果是非法的
printf("ILLEGAL POSITION");
return false;
}

//能走到这里说明以上没有问题,那么开始腾出空间
//采用从后往前的顺序一个个地进行移位
for(int i = L->Last;i>=P;i--){
L->Data[i+1] = L->Data[i];
}

//进行赋值
L->Data[P] = X;

//最后标志末尾位置的变量++
L->Last++;

return true;
}


bool Delete( List L, Position P ){
//首先判断位置是否合法,不合法的话打印并返回
//如果位置位于0和P之间的闭区间的话,就合法,否则就不合法
//如果位置合法的话,那么就删除该节点,并将该位置后面的元素向前挪一位

//判断位置是否合法
if(!((P>=0)&&(P<=L->Last))){
//不合法的情况
printf("POSITION %d EMPTY",P);
return false;
}

//如果走到这里说明位置合法
//如果需要删除的位置在最后一位,那么直接删除即可
//如果不是那么直接挪位即可,因为挪位会直接覆盖掉需要删除的元素
if(P == L->Last){
//直接删除,这里直接将标志最后位置的数减小一位即可
L->Last--;
return true;
}

//如果走到这里说明不是最后一位,那么直接挪位即可
for(int i = P ;i<L->Last;i++){
L->Data[i] = L->Data[i+1];
}

//挪位完成后L->Last--
L->Last--;

//返回
return true;
}

 

posted @ 2019-06-09 17:18  nm_bk  阅读(692)  评论(0编辑  收藏  举报