数组实现的线性表的基本操作2[C语言]
2017-05-30 17:21
435 查看
#include <stdio.h> #include <stdlib.h> #define MAXSIZE 10 // 存储空间最大存储10个元素 #define SUCCESS 1 #define ERROR 0 typedef int ElementType; typedef int Status; typedef struct { ElementType data[MAXSIZE]; int length; } SqList; Status initSqList(SqList* list); Status appendElement(SqList* list, ElementType element); Status insertElement(SqList* list, int pos, ElementType element); Status popElement(SqList* list, ElementType* element); Status deleteElement(SqList* list, int pos, ElementType* element); Status getElement(const SqList* list, int i, ElementType* element); Status traverseList(SqList *list); Status getElement2(SqList list, int i, ElementType* element); // 主函数测试用 int main() { SqList list; // 声明变量,会分配内存空间,但是内存空间的数据是脏数据 int status = initSqList(&list); // 将内存分配的空间里面的数据进行初始化 printf("初始化链表状态:%d\n", status); printf("链表中元素个数:%d\n", list.length); appendElement(&list, 1); appendElement(&list, 3); printf("append后链表中元素为:"); traverseList(&list); insertElement(&list, 4, 40); printf("insert后链表中元素:"); traverseList(&list); ElementType element; getElement(&list, 1, &element); printf("链表中第一个元素的值是:%d\n", element); // 传值方式获取(效率会低) getElement2(list, 2, &element); printf("链表中第二个元素的值是:%d\n", element); status = getElement(&list, 4, &element); if (status) { printf("链表中第四个元素的值是:%d\n", element); } else { printf("获取元素数据失败!"); } status = getElement(&list, 5, &element); if (status) { printf("链表中第五个元素的值是:%d\n", element); } else { printf("获取元素数据失败!"); } printf("链表中元素个数:%d\n", list.length); printf("链表中元素列表:"); traverseList(&list); status = popElement(&list, &element); if (status) { printf("删除的最后一个元素是:%d\n", element); } else { printf("删除失败!"); } printf("链表中元素个数:%d\n", list.length); printf("链表中元素列表:"); traverseList(&list); status = deleteElement(&list, 2, &element); if (status) { printf("删除的元素是:%d\n", element); } else { printf("删除失败!"); } printf("链表中元素列表:"); traverseList(&list); return 0; } /** * 初始化顺序存储的链表 * * @param list SqList* * @return Status */ Status initSqList(SqList* list) { // 初始化链表中所有元素的值 for (int i = 0; i < MAXSIZE; i++) { list->data[i] = 0; } list->length = 0; return SUCCESS; } /** * 向顺序存储的链表尾部插入元素 * * @param list SqList* * @param element ElementType * @return Status */ Status appendElement(SqList* list, ElementType element) { if (list->length >= MAXSIZE) { return ERROR; } list->data[list->length] = element; list->length++; return SUCCESS; } /** * 向顺序存储表中指定位置插入数据 * * @param list SqList* * @param pos int * @param element ElementType * @return Status */ Status insertElement(SqList* list, int pos, ElementType element) { if (pos < 1 || list->length == MAXSIZE || pos > MAXSIZE) { return ERROR; } // 在length之前插入需要移动元素 if (pos <= list->length) { for (int i = list->length-1; i >= pos; i--) { list->data[list->length] = list->data[list->length - 1]; } } list->data[pos-1] = element; // 如果跳跃添加,length直接变成pos if (pos > list->length) { list->length = pos; } else { list->length++; } return SUCCESS; } /** * 删除顺序存储线性表最后一个元素 * * @param list SqList* * @param element ElementType* * @return Status */ Status popElement(SqList* list, ElementType* element) { if (list->length == 0) { return ERROR; } *element = list->data[list->length - 1]; list->data[list->length - 1] = 0; list->length--; return SUCCESS; } /** * 删除顺序表中的元素 * * @param list SqList* * @param pos int * @param element ElementType* * @return Status */ Status deleteElement(SqList* list, int pos, ElementType* element) { if (list->length == 0 || pos < 1 || pos > list->length) { return ERROR; } *element = list->data[pos - 1]; // 移动元素 for (int i = pos; i < list->length; i++) { list->data[pos - 1] = list->data[pos]; } list->length--; return SUCCESS; } /** * 获取顺序存储表中指定位置的值 * 链表是按引用传递,使用const约束不能修改链表的值 * * @param list SqList* * @param i int * @param element ElementType * @return Status */ Status getElement(const SqList* list, int i, ElementType* element) { if (list->length == 0 | i < 1 || i > MAXSIZE) { return ERROR; } *element = list->data[i - 1]; return SUCCESS; } /** * 遍历顺序存储的链表 * * @param list SqList* * @return Status */ Status traverseList(SqList *list) { if (list->length == 0) { return ERROR; } for (int i = 1; i <= list->length; i++) { ElementType element = list->data[i - 1]; printf("%d\t", element); } printf("\n"); return SUCCESS; } /** * 获取顺序存储表中指定位置的值 * 链表是按值传递,传递的是链表的副本 * (浪费内存空间,同样做到不能修改原链表的值) * * @param list SqList* * @param i int * @param element ElementType * @return Status */ Status getElement2(SqList list, int i, ElementType* element) { if (list.length == 0 || i < 1 || i > list.length) { return ERROR; } *element = list.data[i - 1]; return SUCCESS; }
相关文章推荐
- C语言数组实现栈的基本操作,并利用O(1)求出栈中最小元素
- 《大话数据结构》读书笔记之线性表基本操作(数组实现)
- 线性表的基本操作(数组实现)
- 学习笔记——线性表的动态分配顺序存储结构基本操作(C语言实现)
- 顺序线性表的基本操作(C语言实现)
- 学习笔记——线性表的静态分配顺序存储结构基本操作(C语言实现)
- 线性表上的基本操作实现标准版
- C语言实现二叉树的基本操作---创建、遍历、求深度、求叶子结点
- 试用多态实现线性表(队列,串,堆栈),要求具备线性表的基本操作:插入,删除,测长等。
- C语言实现顺序表基本操作汇总
- 数据结构.二叉树的基本操作(C语言实现)
- C语言实现线性表之顺序存储结构操作
- 八.二叉树各种操作的C语言实现 树的一些基本的操作,包括,树的建立,树的深度,
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- c语言实现顺序表的基本操作
- 利用顺序结构实现线性表的基本操作
- 顺序存储结构线性表基本操作 纯C语言实现
- 静态串及其基本操作(C语言实现)
- 学习笔记---线性表的基本操作---顺序存储(C语言)
- 线性结构 -- 连续存储(数组), 1个简单的c语言代码实现.