顺序表的使用

线性表中的顺序表

/*
顺序表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++;
		}
	}
	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值