线性表中的顺序表
/*
顺序表1.0:【1】:编译软件vs2019
【2】:代码语言:C语言
【3】:实现功能(函数):(1)线性表初始化(2)清空线性表(3):查看列表是否为空(4)获取线性表的长度(5)获取某个元素的值
(6)前驱(7)后继(8)数据的删除(9)数据的插入(10)数据的遍历
【4】泛型的实现:void*(无类型的指针)
*/
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<windows.h>//可以用来使用宽字符
#include<conio.h>
typedef byte bool;
//tepedef malloc() iniStr;
//#define string char *;//用来保存数据那样就不限于整形或者是
#define MAX_LENGTH 100//顺序表的最长的长度
#define false 0
#define true 1;
enum choice {
退出 = -1,插入,删除,遍历,修改,获取,排序,为空,定点删除,定点插入
};
typedef struct sequencelist {
int* list;
int currentSize;
}sqList;
void run(sqList* sq); //将所有的操作都放在了这个函数里面
void render(); //用于打印选项
bool iniList(sqList * p); //用于初始化顺序表
void insertData(sqList sqL, int * p); //在尾部插入数据
void dotCircle(COORD coord, BYTE inteval, BYTE num);
void traverseList(sqList sqL); //用于遍历数组
bool destroyList(sqList* sqL); //用于销毁空间
void amend(sqList* sqL, int pos, int* e);
void getElement(sqList* sqL, unsigned position, int* e);
void bubbleSort(sqList* sql); //用于排序的函数
bool isEmpty(sqList* sqL);
bool insert(sqList* sql, int pos, int e);
void delLast(sqList* sql);
bool del(sqList* sql, int pos);
int main() {
//构造一个list
//MessageBox(NULL, L"您还没有建立数据表", L"错误", MB_ICONERROR|MB_OK);
sqList sl;
sl.currentSize = 0;
sl.list = NULL;
COORD coord;
coord.X = 22;
coord.Y = 0;
puts("请稍等,正在初始化数据");
iniList(&sl);//初始化
dotCircle(coord, 2, 6);
puts("");
run(&sl);
}
//用于在指定的位置打点,参数有点的数量,间距,开始的位置
void dotCircle(COORD coord, BYTE interval, BYTE num) {
CONSOLE_CURSOR_INFO curInfo;
curInfo.bVisible = FALSE;
curInfo.dwSize = 1;
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &curInfo);
COORD coord1 = coord;
for (byte i = 0;i < 3;i++) {
coord1 = coord;
//暂时取消
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord1);
{
byte i = 0;
while (i++ < num) {
printf(".");
coord1.X += interval;
Sleep(100);
}
}
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
printf(" ");
}
}
void render() {
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),FOREGROUND_GREEN);
puts(" ______________________________");
puts("|————请选择您要执行的操作--|");
puts("|--------- 0:插入数据----------|");
puts("|--------- 1:尾部删除----------|");
puts("|--------- 2:遍历数据----------|");
puts("|--------- 3:修改数据----------|");
puts("|--------- 4:获取数据----------|");
puts("|--------- 5:排序数据----------|");
puts("|--------- 6:是否为空----------|");
puts("|--------- 7:定点删除----------|");
puts("|--------- 8:定点添加----------|");
puts("|--------- 9:扩充空间----------|");
puts("|-------- -1:退出 -------------|");
puts("|______________________________|");
}
//初始化函数
bool iniList(sqList * p) {
// puts("请输入相应的长度");
p->currentSize = 0;
p->list = (int*)malloc(sizeof(int) * MAX_LENGTH);
if (&p == NULL) {
return false;
}
return true;
}
//在尾部插入数据
void insertData(sqList * sqL, int * e) {
sqL->list[sqL->currentSize] = *e;
sqL->currentSize ++;
}
//实现遍历
void traverseList(sqList sqL) {
unsigned char i = 0;
puts("相应的数据为:");
while (i < sqL.currentSize) {
printf("%d\n",sqL.list[i]);
i++;
}
}
//程序跑起来
void run(sqList * sl) {
/*sqList* p = sl;*/
render();//渲染
int choice;
scanf_s("%d", &choice);
getchar();//吃点那个字符,一会儿看看那个scanf的使用
switch (choice) {
case 插入: {
int num;
printf("请输入你要输入的数据\n");
scanf_s("%d", &num);
insertData(sl, &num);
break;
}
case 删除: {
break;
}
case 遍历: {
traverseList(*sl);
break;
}
case 修改: {
unsigned position;
int e;
puts("请输入你要修改数据的位置:");
scanf_s("%d", &position);
puts("请输入你要更改的数值:");
scanf_s("%d",& e);
amend(sl, position, &e);
break;
}
case 退出: {
exit(-1);
break;
}
case 获取: {
int e, i;
puts("请输入你要获取的数据的位置,按回车键结束!");
scanf_s("%d",&i);
getElement(sl, i, &e);
printf("该数据为 :%d\n", e);
break;
}
case 定点插入: {
int e, pos;
printf("请输入你要插入的位置和数据,按回车键结束");
scanf_s("%d %d", &pos, &e);
insert(sl,pos, e);
break;
}
case 定点删除: {
int pos;
printf("请输入你要删除的数据的位置,按回车键结束");
scanf_s("%d", &pos);
del(sl, pos);
break;
}
case 排序: {
bubbleSort(sl);
break;
}
case 为空: {
if (isEmpty(sl)) {
MessageBox(NULL, L"这个顺序表空的空的", L"ATTENTION", MB_OK|MB_ICONHAND);
}
}
default: {
puts("输入有误");
break;
}
}
system("pause");
system("cls");
run(sl);
}
bool destroyList(sqList *sqL) {
if (sqL->list == NULL) {
MessageBox(GetStdHandle(STD_OUTPUT_HANDLE), L"您还没有建立数据表",L"错误", MB_OK);
return false;
}
else {
free(sqL);
}
}
void amend(sqList *sqL, int pos, int * e) {
sqL->list[pos - 1] = *e;
}
void getElement(sqList *sqL,unsigned position, int *e) {
*e = sqL->list[position - 1];
}
bool isEmpty(sqList*sqL) {
if (sqL->currentSize == 0) {
return true;
}
return false;
}
void delLast(sqList *sql) {
sql->currentSize--;
}
//定点插入位置是相对于用户而言的
bool insert(sqList *sql, int pos ,int e) {
if (pos > sql->currentSize) {
MessageBox(NULL, L"输入错误", L"ATTENTION", MB_ICONERROR | MB_OK);
return false;
}
else {
for (int i = sql->currentSize;i > pos - 2;i--) {
sql->list[i] = sql->list[i - 1];
}
sql->list[pos - 1] = e;
sql->currentSize++;
return true;
}
}
//定点删除
bool del(sqList *sql, int pos) {
sql->currentSize--;
for (int i = pos - 1; i < sql->currentSize ;i++ ) {
sql->list[i] = sql->list[i + 1];
}
}
下面的是另外一个c文件
typedef struct sequencelist {
int* list;
int currentSize;
}sqList;
//这个是冒泡排序
void bubbleSort(sqList *sql) {
{
int i = 0;
while (i < sql->currentSize - 1) {
for (int j = 0; j < sql->currentSize - i - 1; j++) {
if (sql->list[j] > sql->list[j + 1]) {
int temp;
temp = sql->list[j];
sql->list[j] = sql->list[j + 1];
sql->list[j + 1] = temp;
}
}
i++;
}
}
}