#include <stdio.h>
#include <stdlib.h>
#define MAXSIZE 100 typedef int ElemType; typedef struct{
ElemType data[MAXSIZE];
int length;
}SqList; SqList *InitList(SqList *L);//初始化
void DestroyList(SqList *L);//销毁
void ClearList(SqList *L);//清空列表
int ListEmpty(SqList *L);//判空
int ListLength(SqList *L);//返回线性表长度
int GetElem(SqList *L, int i, ElemType *e);//获取第i个元素
int LocateElem(SqList *L, ElemType e);//定位值为e的位置
ElemType PriorElem(SqList *L, ElemType cur_e);//查找前驱
ElemType NextElem(SqList *L, ElemType cur_e);//查找后继
int ListInsert(SqList *L, int i, ElemType e);//插入元素
int ListDelete(SqList *L, int i);//删除第i个元素
int TraverseList(SqList *L);//遍历线性表 //初始化线性表,返回头指针
SqList* InitList(SqList *L){
int x;
int index = ; L = (SqList *)malloc(sizeof(SqList));
if(L){
printf("输入到-1结束\n");
while(){
scanf("%d", &x);
if(x == -){
printf("初始化成功\n");
break;
};
L->data[index++] = x;
}
L->length = index;
}else{
printf("空间不足,初始化失败\n");
}
return L;
} //销毁线性表
void DestroyList(SqList *L){
free(L);
printf("销毁成功\n");
} //清空线性表
void ClearList(SqList *L){
int len = L->length;
int i;
for(i=; i<len; i++){
L->data[i] = ;
}
printf("清空成功\n");
} //判空,1为空,0不为空
int ListEmpty(SqList *L){
return (L->length == );
} //返回线性表长度
int ListLength(SqList *L){
return L->length;
} //获取第i个元素,返回是否获取的状态
int GetElem(SqList *L, int i, ElemType *e){
if(i< || i>L->length){
printf("查找下标%d越界\n",i);
return ;
}
*e = L->data[i-];
printf("第%d个元素是%d\n", i, *e);
return ;
} //返回第一个与e相同元素的位置,返回找寻到的下标
int LocateElem(SqList *L, ElemType e){
int i;
for(i=; i<L->length; i++){
if(L->data[i] == e){
printf("元素%d的位置是第%d个\n",e,i+);
return i+;
} }
printf("%d, 查无此元素的下标\n", e);
return ;
}
//返回元素为e的前驱元素
ElemType PriorElem(SqList *L, ElemType cur_e){
int idx = LocateElem(L, cur_e);
ElemType e;
if(!idx){
return ;
}
if(idx == ){
printf("第一个元素%d没有前驱\n", cur_e);
return ;
}
GetElem(L, idx-, &e);
printf("%d元素的前驱是%d\n",cur_e, e);
return e;
}
//返回元素e的后继元素
ElemType NextElem(SqList *L, ElemType cur_e){
int idx = LocateElem(L, cur_e);
ElemType e;
if(!idx){
return ;
}
if(idx == L->length){
printf("最后一个元素%d没有后继\n", cur_e);
return ;
}
GetElem(L, idx+, &e);
printf("%d元素的后继是%d\n",cur_e, e);
return e;
}
//插入,返回是否插入成功的状态
int ListInsert(SqList *L, int i, ElemType e){
if(i< || i>L->length+){
printf("插入位置有误\n");
return ;
}
if(L->length == MAXSIZE){
printf("线性表已满无法插入新元素\n");
return ;
}
int j;
for(j=L->length-; j>=i-; j--){
L->data[j+] = L->data[j];
}
L->data[i-] = e;
L->length++;
printf("插入成功\n");
return ;
}
//删除第i个元素,返回是否删除成功的状态
int ListDelete(SqList *L, int i){
if(i< || i>L->length){
printf("删除位置有误\n");
return ;
}
int j;
for(j=i; j<L->length; j++){
L->data[j-] = L->data[j];
}
L->length--;
printf("删除成功\n");
return ;
} //遍历线性表
int TraverseList(SqList *L){
if(L->length == ){
printf("空表\n");
return ;
}
if(L->length>MAXSIZE || L->length<-MAXSIZE){
printf("线性表已被摧毁或未初始化\n");
return ;
}
int j;
for(j=; j<L->length; j++){
printf("%d ", L->data[j]);
}
printf("\n");
} int main(void){
int idx;
int len;
ElemType e;
ElemType cur_e;
SqList *L = NULL; L = InitList(L); // printf("线性表长度为%d\n",ListLength(L)); // //判空测试
// if(ListEmpty(L))
// printf("线性表空\n");
// else
// printf("线性表不为空\n"); // //获取元素测试
// idx = 2;
// GetElem(L, idx, &e);
// GetElem(L, L->length+1, &e); // //获取位置测试
// LocateElem(L, 3); // //获取前驱测试
// cur_e = 4;
// PriorElem(L, cur_e);
// GetElem(L, 1, &cur_e);
// PriorElem(L, cur_e); // //插入测试
// ListInsert(L, 1, 999);
// TraverseList(L);
// ListInsert(L, L->length+1, 999);
// TraverseList(L); // //删除测试
// ListDelete(L, 1);
// TraverseList(L); // //清空测试
// ClearList(L);
// TraverseList(L); // //摧毁测试
// DestroyList(L);
// TraverseList(L);
return ;
}
书虽然说是C语言实现,但基本都是用C++的引用参数。
我就尝试把所有的用C语言实现,基本和书上的参数都是一一对应的,
把初始化的返回值改为了一个指针返回,就不用搞那种地址传递还是值传递的问题。
摧毁的功能还有点问题,debug正常,但是正常运行,表内的值还有保留的,百度下来
好像说free这个并不是真正意义上的都释放了。
如果有问题,请指出,我好进行改进。