数据结构 -线性表
线性表:零个或多个数据元素的有限序列
c语言实现一个简单的友好型线性表:
#include <stdio.h>
#include <stdlib.h>
// 1.定义线性表
typedef struct
{
int data[100]; //以数组为载体,存放线性表
int length; //线性表的长度
} List;
// 2.初始化线性表
List initList();
// 3.判断线性表是否非空
int isEmpty(List list);
// 4.获取线性表元素
int getData(List list, int i);
// 5.插入元素
void insertData(List *list, int i, int data);
// 6.遍历打印线性表
void printList(List list);
// 7.删除元素
void deleteData(List *list, int i);
// 8.判断线性表是否存在某个元素
int hasData(List *list, int data);
// 9.查找元素位置
int localData(List list, int data);
// 10.清空线性表 :仍然保留空间
void clearList(List *list);
// 11.获取线性表长度
int getLen(List list);
// 12.线性表操作菜单
void meau(List List);
int main()
{
int choice;
while (1)
{
printf("请选择: 1.初始化线性表 2.退出!\n");
scanf("%d", &choice);
switch (choice)
{
//关于这里为什么加大括号 :switch中case是同属于一个作用域的,在case中定义变量可能会导致错误
// 所以c语言不允许case中:出现定义变量,所以加个大括号划分作用域
//或者在case后加个分号
case 1:
{
List list1 = initList();
meau(list1);
break;
}
case 2:
printf("欢迎下次使用!\n");
return 1;
default:
printf("选择错误,请重新选择!\n");
break;
}
}
}
// 2.初始化线性表
List initList()
{
List list;
list.length = 0;
printf("初始化完成!\n");
return list;
}
// 3.判断线性表是否非空
int isEmpty(List list)
{
if (list.length == 0)
{
printf("线性表为空\n");
}
else
{
printf("线性表不为空\n");
}
}
// 4.获取线性表元素
int getData(List list, int i)
{
return list.data[i - 1];
}
// 5.插入元素
void insertData(List *list, int i, int data)
{
if (list->length >= 100)
{
printf("线性表已满!\n");
}
//插入位置不合理
else if (i > list->length + 1 || i < 1)
{
printf("插入位置不合理!\n");
}
else if (hasData(list, data) == 1)
{
printf("线性表已经存在该元素!\n");
}
else
{
for (int k = list->length; k >= i - 1; k--)
{
list->data[k] = list->data[k - 1];
}
list->data[i - 1] = data;
printf("插入成功!\n");
list->length++;
}
}
// 6.遍历打印线性表
void printList(List list)
{
for (int i = 0; i < list.length; i++)
{
printf("第%d个元素为:%d\n", i + 1, list.data[i]);
}
}
// 7.删除元素
void deleteData(List *list, int i)
{
if (list->length == 0)
{
printf("线性表为空!\n");
}
else if (i < 1 || i > list->length)
{
printf("删除位置不合理!\n");
}
else
{
for (; i < list->length; i++)
{
list->data[i - 1] = list->data[i];
}
list->length--;
}
}
// 8.判断线性表是否存在某个元素
int hasData(List *list, int data)
{
for (int i = 0; i < list->length; i++)
{
if (data == list->data[i])
{
printf("元素存在!\n");
return 1;
}
}
printf("元素不存在!\n");
return 0;
}
// 9.查找元素位置
int localData(List list, int data)
{
for (int i = 0; i < list.length; i++)
{
if (data == list.data[i])
{
printf("元素位置为%d\n", i + 1);
return i + 1;
}
}
//无此元素
printf("无此元素!\n");
return 0;
}
// 10.清空线性表 :仍然保留空间
void clearList(List *list)
{
list->length = 0;
printf("清空成功!\n");
}
// 11.获取线性表长度
int getLen(List list)
{
printf("线性表长度为%d\n", list.length);
return list.length;
}
// 12.线性表操作菜单
void meau(List list)
{
int choice;
int position;
int data;
while (1)
{
printf("请选择操作:\n ");
printf("1.插入元素\n ");
printf("2.删除元素\n ");
printf("3.打印线性表\n ");
printf("4.判断线性表是否非空\n ");
printf("5.查找元素位置\n ");
printf("6.判断元素是否存在\n ");
printf("7.获取线性表长度\n ");
printf("8.清空线性表\n ");
printf("9.退出\n ");
printf("请选择:");
scanf("%d", &choice);
switch (choice)
{
case 1:
printf("请输入插入位置:");
scanf("%d", &position);
printf("请输入插入元素:");
scanf("%d", &data);
insertData(&list, position, data);
break;
case 2:
printf("请输入删除元素位置:");
scanf("%d", &position);
deleteData(&list, position);
break;
case 3:
printList(list);
break;
case 4:
isEmpty(list);
break;
case 5:
printf("请输入查找元素:");
scanf("%d", &data);
localData(list, data);
break;
case 6:
printf("请输入查找元素:");
scanf("%d", &data);
hasData(&list, data);
break;
case 7:
getLen(list);
break;
case 8:
clearList(&list);
break;
case 9:
printf("欢迎下次使用\n");
exit(1);
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
}
}