这里引起我注意的点是创建空表的时候,保存最后一个元素位置的变量需要设置为-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; }