此为《数据结构c语言版》(人民邮电出版社)第一章顺序表的参考代码。本代码存在一些不安全的操作,仅供参考,可以改进。
#include<stdio.h>
#include<stdlib.h>
#include<iostream>
using namespace std;
using ll = long long;
typedef struct vec {
int count;
int* data;
int size;
}vec;
vec* InitList(int a) {//a是数组的大小
vec* v = (vec*)malloc(sizeof(vec));
v->data = (int*)malloc(sizeof(int) * a);//分配内存
if (v->data != NULL)v->size = a;//初始化数组大小
v->count = 0;
return v;
}
void DestroyList(vec* v) {//销毁操作
v->count = 0;
v->size = 0;
free(v->data);
free(v);
cout << "destroyed successfully" << endl;
return;
}
void Clearlist(vec* v) {//清空操作
v->count = 0;
v->size = 0;
free(v->data);
return;
}
bool ListEmpty(vec* v) {//判断空表,是空表返回真
if (v->count == 0)return true;
else return false;
}
int ListLength(vec* v) {//返回数组的元素个数
return v->count;
}
int* GetElem(int n, int* p, vec* v) {//访问第n个数据的地址
p = &v->data[n];
return p;
}
int LocateElem(vec* v, int x) {//查找第一个与x相同的元素的下标,若不存在返回值为0.
for (int i = 1; i <= v->count; i++) {
if (v->data[i] == x)return i;
}
return 0;
}
int* PriorElem(int cur_e, vec* v, int* pre) {//查找前驱元素,若不存在返回值为0.
for (int i = 1; i <= v->count; i++) {
if (v->data[i] == cur_e && i != 1) {
pre = &v->data[i - 1];
cout << "前驱元素为" << *pre << endl;
return pre;
}
}
cout << "no solve";
return 0;
}
int* NextElem(vec* v, int cur_e, int* next) {//查找后继元素,若不存在返回值为0.
for (int i = 1; i <= v->count; i++) {
if (v->data[i] == cur_e && i != v->count) {
next = &v->data[i + 1];
cout << "后继元素为" << *next << endl;
return next;
}
}
cout << "no solve" << endl;
return 0;
}
void expend(vec* v) {//扩容操作。如果数组满了可以自动扩容为原来的2倍
v->size *= 2;
int* p = (int*)realloc(v->data, sizeof(int) * v->size);
if (p == NULL) {
cout << "no space " << endl;
return;
}
v->data = p;
return;
}
void ListInsert(vec* v, int m, int x) {//插入操作
if (v->count == v->size)expend(v);
for (int i = v->count; i >= x; i--) {
swap(v->data[i], v->data[i + 1]);
}
v->data[x] = m;
v->count++;
return;
}
void ListDelete(vec* v, int x) {//删除操作
for (int i = x; i < v->count; i++) {
swap(v->data[i], v->data[i + 1]);
}
v->count--;
cout << "删除成功" << endl;
return;
}
void Traverselist(vec* v) {//遍历操作
for (int i = 1; i <= v->count; i++) {
cout << v->data[i] << " ";
}
cout << endl;
return;
}
int main() {
srand(time(NULL));//随机数种子
vec* v = InitList(10);
int m;
cout << "输入线性表的元素个数" << endl;
cin >> m;
for (int i = 1; i <= m; i++) {//随机生成10个元素
if (v->count + 1 == v->size)expend(v);//如果数组满了就扩容
v->data[i] = rand() % 100;//随机生成100以内的整数
v->count++;
}
cout << "线性表:";
Traverselist(v);
cout << "销毁请输入1" << endl;
cout << "清空请输入2" << endl;
cout << "插入请输入3" << endl;
cout << "删除请输入4" << endl;
cout << "查找第一个与x相同的元素的下标请输入5" << endl;
cout << "查找前驱元素请输入6" << endl;
cout << "查找后继元素请输入7" << endl;
cout << "扩容请输入8" << endl;
cout << "遍历请输入9" << endl;
while (1) {
int a, b, c;
int* next, * pre;
int choice;
cin >> choice;
switch (choice) {
case 1:
DestroyList(v);
cout << "销毁成功" << endl;
break;
case 2:
Clearlist(v);
cout << "清空成功" << endl;
break;
case 3:
cout << "请输入插入的位置和值";
cin >> a >> b;
ListInsert(v, b, a);
cout << "插入成功" << endl;
break;
case 4:
cout << "请输入删除的位置";
cin >> a;
ListDelete(v, a);
break;
case 5:
cout << "请输入查找的元素";
cin >> a;
c = LocateElem(v, a);
if (c != 0)cout << "找到了,下标为" << c << endl;
else cout << "没有找到" << endl;
break;
case 6:
cout << "请输入查找的元素";
cin >> a;
pre = (int*)malloc(sizeof(int));
pre = PriorElem(a, v, pre);
break;
case 7:
cout << "请输入查找的元素";
cin >> a;
next = (int*)malloc(sizeof(int));
next = NextElem(v, a, next);
break;
case 8:
expend(v);
break;
case 9:
Traverselist(v);
break;
default:
cout << "输入错误" << endl;
break;
}
}
return 0;
}