/**
*hqweay
*线性表的简单实现
*/
#include<stdio.h>
#include<stdlib.h>
//定义常量
//优化代码的弹性
#define LIST_INIT_SIZE 5
#define LIST_INCREMENT 10
typedef int ElemType;
//定义线性表
typedef struct{
ElemType *elem;
int length;
int listsize;
}SqList;
//UI
void ShowUI();
//打印链表
void PrintList(SqList L);
//初始化线性表
void InitList(SqList *L);
//添加数据
void AddList(SqList *L, ElemType e);
//插入数据
void InsertList(SqList *L, int i, ElemType e);
//删除数据
void DeleteData(SqList *L, int i);
//查询数据
int FindDateByList(SqList L, int i);
int main(){
SqList List;
List.elem = NULL;
char key;
while(1){
ShowUI();
scanf("%c", &key);
switch(key){
case '1':
InitList(&List);
break;
case '2':
PrintList(List);
_sleep(1000);
break;
case '3':
system("cls");
printf("\n请输入您想添加的数据\n");
int e;
scanf("%d", &e);
AddList(&List, e);
break;
case '4' :
printf("您想删除哪个数据?\n请输入\n");
int i;
scanf("%d", &i);
DeleteData(&List, i);
break;
case '5' :
printf("请输入\n您想插入的位置\n您想插入的数据\n用空格隔开");
scanf("%d %d", &i, &e);
InsertList(&List, i, e);
break;
case '6' :
printf("请输入您想查询的位置");
scanf("%d", &i);
FindDateByList(List, i);
_sleep(1000);
break;
default:
;
}
}
}
//实现UI
void ShowUI(){
system("cls");
printf("\n******************************************************");
printf("\n");
printf("\n");
printf("\n");
printf("\n");
printf("\n 1.初始化线性表");
printf("\n 2.打印线性表");
printf("\n 3.添加数据");
printf("\n 4.删除数据");
printf("\n 5.插入数据");
printf("\n 6.查询数据");
printf("\n");
printf("\n");
printf("\n 请输入数字进行相应操作");
printf("\n");
printf("\n");
printf("\n");
printf("\n******************************************************\n");
}
//实现打印数据
void PrintList(SqList L){
if(NULL == L.elem){
printf("\n抱歉 还未开辟内存\n");
exit(0);
}
if(0 == L.length ){
printf("\n抱歉 还没有数据\n");
_sleep(1000);
}
system("cls");
int i;
for(i = 1; i <= L.length; i++){
printf("\n第%d个元素为%d", i, *(L.elem + i - 1));
}
}
//实现初始化数据
void InitList(SqList *L){
system("cls");
//分配空间
L->elem = (ElemType*)malloc(LIST_INIT_SIZE*sizeof(ElemType));
if(NULL == L->elem){
printf("\n抱歉 内存分配失败\n");
exit(0);
}
//初始化数组无数据故长度为0
L->length = 0;
//初始化线性表最大容量
L->listsize = LIST_INIT_SIZE;
}
//实现添加数据
void AddList(SqList *L, ElemType e){
system("cls");
if(NULL == L->elem){
printf("\n抱歉 还未开辟内存\n");
exit(0);
}
if(L->length >= L->listsize){
printf("\n抱歉 线性表没有多余的位置了\n");
}else{
//赋值给数组最后一个位置的数据
*(L->elem + L->length) = e;
L->length++;
}
}
//实现插入数据
void InsertList(SqList *L, int i, ElemType e){
system("cls");
if(i < 0 || i > L->listsize){
printf("\n抱歉,超出范围啦\n");
}else{
//定义 p 为数组最后一个数据
ElemType* p = (L->elem + L->length -1);
//通过循环从最后一个数据向后移动一个位置
//每移动一次 p的位置-1
//终止条件为p移动到插入位置
while(p >= L->elem + i -1){
*(p + 1) = *p;
--p;
}
*(p + 1) = e;
L->length++;
}
printf("\n您在第%d个位置插入了数据%d\n", i, e);
}
//实现删除数据
void DeleteData(SqList *L, int i){
system("cls");
if(NULL == L->elem){
printf("\n抱歉 还未开辟内存\n");
exit(0);
}
if(i < 0 || i > L->listsize){
printf("\n抱歉,超出范围啦\n");
}else{
//用p 储存要删除的数据位置
ElemType* p = (L->elem + i - 1);
ElemType temp = *(L->elem + i - 1);
printf("\n您删除了第%d个位置的数据:%d\n", i, temp);
int j;
//利用循环移动数据
for(j = 0; j < L->length - 1; j++){
printf("\n哈哈%d\n", *(p+1));
*p = *(p + 1);
p++;
}
}
--L->length;
}
int FindDateByList(SqList L, int i){
system("cls");
if(NULL == L.elem){
printf("\n抱歉 还未开辟内存\n");
exit(0);
}
if(i < 0 || i > L.length ){
printf("\n抱歉,超出范围啦\n");
return 0;
}
ElemType temp = *((&L)->elem + L.length - 1);
printf("\n您查询的是第%d个数据:%d", i, temp);
}
【C语言 数据结构】 简单线性表实现
最新推荐文章于 2022-11-27 18:34:41 发布