数据结构原本的书籍上面只写了算法部分,不能直接运行,在此贴上c语言实现的完整代码,需要注意的地方已在代码中注释
#include <stdio.h>
#include <malloc.h>
#define LIST_SIZE 100//初始分配空间的节点个数
#define LIST_INCREMENT 10//新分配空间的节点个数
typedef int ElemType;
typedef struct book{
ElemType* elem;//存储空间基地址
int length;//当前长度
int list_size;//当前分配的存储容量
}SqList;
int init(SqList &L) {//初始化空间
L.elem = (ElemType*)malloc(LIST_SIZE*sizeof(ElemType));//注意这里malloc中的*是指乘号,不是指针运算符
if (!L.elem) {
printf("顺序表初始化失败\n");
return false;
}
L.length = 0;
L.list_size = LIST_SIZE;
L.elem[0] = NULL;//&时候使用.*时候使用->
printf("顺序表初始化成功\n");
return 0;
}
int add(SqList *L) {//在第i个节点之前插入元素e
//判断i是否合法
printf("请输入要插入的位置,以及插入的数值:\n");
int i, e;
scanf_s("%d,%d", &i, &e);
if (i<1||i>L->length+1)
{
return 1;
}
//判断当前存储空间是否已满
if (L->length>=L->list_size)
{
printf("当前存储空间已满,正在新增存储空间……\n");
ElemType* newbase = (ElemType*)realloc(L->elem, (L->list_size + LIST_INCREMENT) * sizeof(ElemType));
if (!newbase) {
printf("存储空间分配失败\n");
return 2;
}
L->elem = newbase;//新的基址
L->list_size += LIST_INCREMENT;//刷新存储容量
}
ElemType* q = &(L->elem[i - 1]);//这里不是i,因为i始终比数组元素下标大1。
//开始插入操作
for (ElemType* p = &L->elem[L->length - 1]; p >= q; p--)
//这里让p先指向最后一个节点,依次后移,
//直到p指向第i个节点,即下标为i-1
//注意p--,相当于是p=p-4而不是p=p-1,这和指针p的数据类型有关。
{
*(p + 1) = *p;
}
*q = e;//将e赋值给第i个位置的节点
L->length++;//表长加1
return 0;
}
int remove(SqList &L) {//删除元素
printf("请输入要删除的节点位置:\n");
int i;
scanf_s("%d", &i);
for (ElemType* p = &L.elem[i-1]; p <= &L.elem[L.length - 1]; p++) {
*p = *(p + 1);
}
L.length--;//表长减1
return 0;
}
int update(SqList &L) {//修改元素
printf("请输入要修改节点的位置以及修改后的值:\n");
int i,e;
scanf_s("%d,%d", &i,&e);
ElemType* q = &L.elem[i-1];
*q = e;
return 0;
}
void select(SqList* L) {//查询元素
int i;
printf("输入你想查询的位置:\n");
scanf_s("%d", &i);
ElemType* q = &L->elem[L->length - 1];
printf("顺序表中的所有元素如下:\n");
for (ElemType* p =&L->elem[0]; p <=q;p++) {
printf("%d\t", *p);
}
printf("\n");
printf("第%d个位置的元素是:\n",i);
ElemType* e = &L->elem[i - 1];
printf("%d\n", *e);
}
int main() {
//定义一个新节点L
SqList L;
//初始化顺序表
int status= init(L);
//如果初始化成功,选择相应的操作
if (status==0) {
while (1) {
printf("请选择你要进行的操作:\n");
printf("\t0.退出\n");
printf("\t1.增加节点\n");
printf("\t2.删除节点\n");
printf("\t3.修改节点\n");
printf("\t4.查询节点\n");
int will = 0;
scanf_s("%d", &will);
if (will == 0) {
break;
}
switch (will) {
case 1:status = add(&L); if (status == 0) { printf("节点插入成功\n"); } break;
case 2:status = remove(L); if (status == 0) { printf("节点删除成功\n"); }break;
case 3:status = update(L); if (status == 0) { printf("节点修改成功\n"); }break;
case 4:select(&L);break;
default:break;
}
}
}
return 0;
}