源自《大话数据结构》原书代码,未完待续
#include <stdio.h>
#include <stdlib.h>
//类型定义
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define MAXSIZE 20
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType data[MAXSIZE];
int length;
}SqList;
//遍历顺序表
Status ListShow(SqList L){
int i;
for(i=0; i<L.length; i++) {
printf("%d ", L.data[i]);
}
printf("\n");
return OK;
}
//初始化顺序表
Status ListInit(SqList *L) {
L->length = 0;
return OK;
}
//顺序表L在i位置插入元素e
Status ListInsert(SqList *L, int i, ElemType e) {
int k;
//列表是否已满
if(L->length == MAXSIZE) {
return ERROR;
}
//顺序表不允许相隔插入
if(i<0 || i>L->length+1){
return ERROR;
}
//如果插入数据不在表尾加1
if(i<=L->length) {
for (k = L->length-1; k >= i-1; k--) {
L->data[k+1] = L->data[k];
}
}
//把新元素插入i位置
L->data[i-1] = e;
//表长加1
L->length++;
return OK;
}
//判断顺序表是否为空
Status ListEmpty(SqList L) {
return L.length==0;
}
//查看第i个元素的内容
Status GetElem(SqList L, int i, ElemType *e) {
if(i<0 || i>L.length)
return ERROR;
*e = L.data[i-1];
return OK;
}
//删除顺序表中某个元素
Status ListDelete(SqList *L, int i, ElemType *e) {
int k;
if(L->length==0)
return ERROR;
if(i<0 || i>L->length)
return ERROR;
*e = L->data[i-1];
if(i<L->length) {
for(k=i; k<L->length; k++)
L->data[k-1] = L->data[k];
}
L->length--;
return OK;
}
//顺序表长度
int ListLength(SqList L) {
return L.length;
}
//查找一个元素在顺序表里的序号
Status LocateElem(SqList L, int search, int *e){
int k;
if(L.length==0)
return ERROR;
for(k=0; k<L.length-1; k++) {
if(L.data[k]==search)
break;
}
*e = k+1;
return OK;
}
int main(void) {
SqList L;
int i;
//顺序表初始化
i = ListInit(&L);
printf("ListInit result is:%d(1:success, 0:fail)\n", i);
//在表头插入10个元素
for(i=10; i>0; i--)
ListInsert(&L, 1, i);
//表尾插入
ListInsert(&L, 1, 0);
//显示整个顺序表
ListShow(L);
//查看第二个元素是什么
GetElem(L, 2, &i);
printf("第2个元素内容是:%d \n", i);
//判断元素是否在顺序表里,如果在返回序号,否则返回0
LocateElem(L, 4, &i);
printf("4在顺序表里的序号是:%d \n", i);
//删除第五个元素
GetElem(L, 5, &i);
printf("第五个元素是:%d \n", i);
ListDelete(&L, 5, &i);
printf("删除第五个元素后 \n");
ListShow(L);
return 0;
}
迷惑过,为什么清空一个顺序表直接length=0,后经人指点 有序列表下次insert操作时候会把数据修改后length++,虽然会有部分老数据没修改,但是正常访问顺序表根本不会访问到那些旧数据