数据结构-c语言版
前言:本来不想用纯c写的,(c与c++混合版,c++单独版已经够了),但我们死板又可爱的数据结构老师非要我们用纯c写[doge],好了,数据结构-纯c语言版-硬钢顺序表,她来了!
本文章将收费,原因是:本文章只是按照大学里老师的要求写,仅用于学习和交作业,没有企业会要这样的写法,除了学生党,其他群体没有太大的必要参考;
#include<stdio.h>
#include<stdlib.h>
#define MAXSIZE 100
typedef struct {
int elem [MAXSIZE];
int last;//在有元素的前提下,最后一个元素的下标[0,last] , 否则为-1
}SqList;
void Create(SqList* L) {//创建顺序表
//int elem [MAXSIZE];
L->last = -1;//没有元素是下标为-1
//L->elem[0] = 1;
return;
}
int InitList(SqList* L) {//初始化顺序表
//int elem[MAXSIZE];
int n;
printf("请输入要初始化顺序表元素的个数:\n");
scanf("%d", &n);
printf("您要初始化顺序表元素的个数为%d:\n", n);
for (int i = 0; i < n; i++) {
scanf("%d", &L->elem[i]);
L->last=n-1;
}
// L->last++;
return 0;
}
//前插法
int ListInsert(SqList* L, int i, int e) {//在第i个元素前插入元素e
//可以在第一个和最后一个元素的前面插入
if (i < 1 || i > L->last + 2) { //i表示插入的位置(不是下标),即插入的位置最小是1,最大是last+2
//i=1时,就if(假)=>i合法
//i=last+2时,也是if(假)=>i合法
//当i超过上面的范围时,就if(真),i就不合法
printf("i值不合法");
return 0;//if(0)为假
}
if (L->last == 100) {
printf("存储空间已满");
return 0;//if(0)为假
}
for (int j = L->last; j >= i-1; j--) {//传进来的i不是下标,但遍历的时候还是用下标(i-1)
L->elem[j + 1] = L->elem[j];
}
L->elem[i-1] = e;
L->last++;
return 1;//if(非0)为真
}
void ListPrint(SqList* L) {
printf("已经保存的元素个数为:%d\n", L->last+1);
for (int j = 0; j < L->last+1; j++) {
printf("%d\t", L->elem[j]);
}
printf("\n");
}
int listDelete(SqList* L, int i) {
//可以删除第一个和最后一个元素
if (i < 1 || i>L->last + 1) {
//i=1时,1<1,假的,就if(假)=>if{}不执行=>i合法
//i=last+2时,也是if(假)=>i合法
//当i超过上面的范围时,就if(真),i就不合法
printf("不合法\n");
return 0;//if(0)为假
}
for (int j = i-1; j < L->last; j++) {//传进来的i不是下标,但遍历的时候还是用下标(i-1)
L->elem[j] = L->elem[j + 1];
}
L->last--;
return 0;//if(非0)为真
}
int listSeek(SqList* L, int e) {//查找元素e的位置是i
int i = 0;
for (int j = L->last; j >= i; j--) {
if (L->elem[j] == e) {
i = j;//if(0)=>if(假)
break;//当找到位置i时就跳出循环,返回i,否则就不用break,返回最初始的i
}
}
return i;
}
int main() {
SqList L;
Create(&L);//创建顺序表
printf("顺序表创建成功...\n");
InitList(&L);
printf("顺序表初始化成功...\n");
ListPrint(&L);
printf("请分别输入要插入的位置(不是下标)和元素(用空格隔开):");
int m, s;
scanf("%d %d", &m, &s);
if (ListInsert(&L, m , s)) {
printf("插入成功\n");
}
else {
printf("插入失败");
}
ListPrint(&L);
printf("请输入要删除的位置(不是下标)===========\n");
int v;
scanf("%d", &v);
if (listDelete(&L, v)) {
printf("删除成功\n");
}
else {
printf("删除失败");
}
ListPrint(&L);
int e;
printf("请输入您要查找的元素:\n");
scanf("%d", &e);
if (listSeek(&L, e)) {
printf("查找成功\n");
printf("找的元素%d的位置是:%d(不是下标)\n", e, listSeek(&L, e) + 1);
}
else {
printf("查找失败\n");
}
system("pause");
return 0;
}