|
题目:对顺序表中的元素进行增加和删除以及访问
使用数组实现线性表的特性,需要知道三个条件:数组元素的容量、数组有效的最后一个元素的下标- /*************************************************************************
- * file name: LinkedList.c
- * author : User_laubon@163.com
- * date : 2024/04/22
- * function : 该案例是掌握进行顺序表创建、增删改查等操作
- * note : None
- *
- * Copyright (c) 2023-2024 cececlmx@126.com All right Reserved
- * *************************************************************************/
- #include<stdio.h>
- #include<stdlib.h>
- #include<stdbool.h>
- //将创建顺序表的要素设置成一个结构体
- typedef struct table
- {
- char * addr; //数组元素首地址
- unsigned int Size; //数组的容量
- int Last; //数组有效元素的最后一个元素的下标
- }Tab; //将表格结构体重新命名成Tab
- //创建一个顺序表
- Tab* Table_creat (unsigned int size)
- {
- //1.创建一个表格指针,并赋予空间
- Tab* Manager = (Tab*)calloc(1,sizeof(Manager));
-
- //判断申请堆空间是否申请成功
- if (NULL == Manager)
- {
- printf("堆空间申请失败\n");
- exit(-1);
- }
-
- //2.利用calloc为所有元素申请堆内存
- Manager->addr = (char *)calloc(size,sizeof(char));
- //判断申请堆空间是否申请成功
- if (NULL == Manager->addr)
- {
- perror("calloc memory for manager is failed\n");
- exit(-1);
- }
-
- //3.对管理顺序表的结构体进行初始化(元素容量 + 最后元素下标)
- Manager->Size = size; //对顺序表中的容量进行初始化
- Manager->Last = -1; //由于顺序表为空,则最后元素下标初值为-1
-
- return Manager;
- }
- //向顺序表中增加数据
- bool TabAdd(Tab *Manager, char Data , int Data_site)
- {
-
- bool Judg_IsFull = (Manager->Last + 1 == Manager->Size) ? true : false;
- if (Judg_IsFull)
- {
- printf("顺序表中数据已满,无法添加\n");
- exit(-1);
- }
- if (1 == Data_site)
- {
- //1.向数据表末尾增加数据
- Manager->addr[++Manager->Last] = Data;
- return true;
- }
- else if(2 == Data_site)
- {
- //2.向数据表开头增加数据
- for (int i = Manager->Last;i >= 0;i--)
- {
- Manager->addr[i+1] = Manager->addr[i];
- }
- //把新元素添加到顺序表的头部,并且更新管理结构体中的元素下标+1
- Manager->addr[0] = Data;
- Manager->Last++;
- return true;
- }
- else
- {
- printf("数据位置类型输入错误,注:1为数据尾部,2为数据开头\n");
- return false;
- }
- }
- //向数据表中删除数据
- bool TabDel(Tab *Manager, char DelData)
- {
- //1.判断顺序表是否为空
- bool Judg_Empty = (-1 == Manager->Last) ? true : false;
- if (Judg_Empty == true)
- {
- printf("顺序表中数据为空,无法删除\n");
- exit(-1);
- }
-
- int temp = -1; //记录要删除的元素的下标
- //2.此时需要查找目标值是否在顺序表中
- for(int i = 0; i <= Manager->Last; ++i)
- {
- //如果目标值和顺序表中元素的值相同
- if (DelData == Manager->addr[i])
- {
- temp = i; //把目标元素的下标备份到变量temp中
- break;
- }
- }
-
- //3.如果顺序表没有目标值的元素则直接终止函数
- if (-1 == temp)
- {
- printf("DelData [%c] is not found\n", DelData);
- return false;
- }
- //4.如果找到了目标元素,则直接把该元素的后继元素向前移动一个单位
- for (int i = temp ; i < Manager->Last ; ++i)
- {
- Manager->addr[i] = Manager->addr[i+1];
- }
- //5.由于删除了一个元素,则需要让顺序表的有效元素下标-1
- Manager->Last--;
- return true;
- }
- //遍历顺序表的元素
- void TabList_Print(Tab *Manager)
- {
- for (int i = 0; i <= Manager->Last; ++i)
- {
- printf("Element[%d] = %c\n",i,Manager->addr[i]);
- }
- }
- int main (int argc, char const * argv[])
- {
- //1.创建顺序表
- Tab * Manager = Table_creat (10);
- //2.向顺序表中增加元素
- printf("输入元素,1为数据尾部,2为数据开头\n");
- TabAdd(Manager, 'a' , 1);
- TabAdd(Manager, 'v' , 1);
- TabAdd(Manager, 'd' , 2);
- //遍历顺序表中的元素
- TabList_Print(Manager);
- //3.删除顺序表中的元素
- char str[] = {'a','d','n'};
- TabDel(Manager, str[0]);
- TabDel(Manager, str[1]);
- TabDel(Manager, str[2]);
- //遍历顺序表中的元素
- TabList_Print(Manager);
- return 0;
- }
复制代码 来源:https://www.cnblogs.com/banon/p/18151915
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作! |
|