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; 
}
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号