数据结构(13)线性表
来源:互联网 发布:python 迭代器使用 编辑:程序博客网 时间:2024/04/30 15:29
线性表是最基本、最简单、也是最常用的一种数据结构。线性表中数据元素之间的关系是一对一的关系,即除了第一个和最后一个数据元素之外,其它数据元素都是首尾相接的。线性表的逻辑结构简单,便于实现和操作。因此,线性表这种数据结构在实际应用中是广泛采用的一种数据结构。Balabala.....其实最简单的也就不用说了,上述是取自百度百科对于线性表的定义。而在这里,就简单说明下线性表的定义:
线性表是具有相同类型的n个数据元素的有限序列: (a1, a2, a3, a4, ......, an) ai是表项, n是表长度
或许大家应该能联想到数组,其实是和线性表是一个道理,性质如下:
1. a0为表首元素,只有一个后继
2. an为表尾元素,只有一个前驱
3. 除a0和an外的其他元素ai,既有前驱,又有后继
4. 线性表能够逐项访问和顺序存取
这里主要介绍线性表的常用操作:
l 创建线性表
l 销毁线性表
l 清空线性表
l 表元素插入
l 表元素删除
l 获取表中某个位置的元素
l 获取表长度
代码总分为三个文件:
SeqList.h : 放置功能函数的声明,以及表和表结点的声明
SeqList.h : 放置功能函数的定义,以及表和表结点的定义
Main.c : 主函数,使用功能函数完成各种需求,不过我一般是用作测试
用一副图来描述下代码的总体结构:
其实对于在SeqList.c 和SeqList.h文件中分别定义SeqList,我刚开始看的时候也不懂,在SeqList.c文件中每次使用函数参数中的list,需要强制类型转换为sList,后来才知道多了一次转换是为了更高的安全性和可靠性。
这里着重说下插入操作和删除操作:
插入操作:
如图
插入元素方法:
首先判断线性表﹑插入位置是否合法,表是否已满
把最后一个元素到插入位置的元素向后移一个位置
把新元素插入
最后把线性表长度加1
删除操作:
如图
删除元素方法:
首先判断线性表﹑删除位置是否合法
把要删除的元素取出
然后从删除元素后一个位置的元素到最后元素依次往前移一个位置
最后把线性表长度减1
OK! 上代码:
SeqList.h
- #ifndef _SEQLIST_H_ //防止重复调用
- #define _SEQLIST_H_
- typedef void SeqList;
- typedef void SeqListNode;
- SeqList* SeqList_Create(int capacity);
- void SeqList_Destroy(SeqList* list);
- void SeqList_Clear(SeqList* list);
- int SeqList_Length(SeqList* list);
- int SeqList_Capacity(SeqList* list);
- int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);
- SeqListNode* SeqList_Get(SeqList* list, int pos);
- SeqListNode* SeqList_Delete(SeqList* list, int pos);
- #endif
SeqList.c
- #include <stdio.h>
- #include <malloc.h>
- #include "SeqList.h"
- typedef unsigned int TSeqListNode;
- typedef struct _tag_SeqList
- {
- int capacity;
- int length;
- TSeqListNode* node;
- }TSeqList;
- SeqList* SeqList_Create(int capacity)
- {
- TSeqList* ret = NULL;
- if(ret == NULL)
- {
- ret = (TSeqList*)malloc(sizeof(TSeqList) + sizeof(TSeqListNode)*capacity);
- }
- if(ret != NULL)
- {
- ret->capacity = capacity;
- ret->length = 0;
- ret->node = (TSeqListNode*)(ret+1);
- }
- return ret;
- }
- void SeqList_Destroy(SeqList* list)
- {
- free(list);
- }
- void SeqList_Clear(SeqList* list)
- {
- TSeqList* sList = (TSeqList*)list;
- if(sList!=NULL)
- {
- sList->length = 0;
- }
- }
- int SeqList_Length(SeqList* list)
- {
- TSeqList* sList = (TSeqList*)list;
- int ret = -1;
- if(sList!=NULL)
- {
- ret = sList->length;
- }
- return ret;
- }
- int SeqList_Capacity(SeqList* list)
- {
- TSeqList* sList = (TSeqList*)list;
- int ret = -1;
- if(sList!=NULL)
- {
- ret = sList->capacity;
- }
- return ret;
- }
- int SeqList_Insert(SeqList* list, SeqListNode* node, int pos)
- {
- TSeqList* sList = (TSeqList*)list;
- int ret = (sList!=NULL);
- int i = 0;
- ret = ret && (sList->length+1 <= sList->capacity);
- ret = ret && (pos >= 0);
- if(ret)
- {
- if(pos >= sList->length)
- {
- pos = sList->length;
- }
- for(i=sList->length; i>pos; i--)
- {
- sList->node[i] = sList->node[i-1];
- }
- sList->node[i] = (TSeqListNode)node;
- sList->length++;
- }
- return ret;
- }
- SeqListNode* SeqList_Get(SeqList* list, int pos)
- {
- TSeqList* sList = (TSeqList*)list;
- SeqListNode* ret = NULL;
- if( (sList!=NULL) && (pos >= 0) && (pos<sList->length) )
- {
- ret = (TSeqListNode*)(sList->node[pos]);
- }
- return ret;
- }
- SeqListNode* SeqList_Delete(SeqList* list, int pos)
- {
- SeqListNode* ret = SeqList_Get(list, pos);
- TSeqList* sList = (TSeqList*)list;
- int i = 0;
- if(ret!=NULL)
- {
- for(i=pos+1; i<sList->length; i++)
- {
- sList->node[i-1] = sList->node[i];
- }
- sList->length--;
- }
- return ret;
- }
main.c
- #include <stdio.h>
- #include <stdlib.h>
- #include "SeqList.h"
- int main(void)
- {
- SeqList* list = SeqList_Create(6);
- int i=0, j=1, k=2;
- int x=3, y=4, z=5;
- int index = 0;
- SeqList_Insert(list, &i, 0);
- SeqList_Insert(list, &j, 0);
- SeqList_Insert(list, &k, 0);
- SeqList_Insert(list, &x, 0);
- SeqList_Insert(list, &y, 0);
- SeqList_Insert(list, &z, 0);
- for(index=0; index<SeqList_Length(list); index++)
- {
- int* p = (int*)SeqList_Get(list, index);
- printf("%d\n", *p);
- }
- while(SeqList_Length(list) > 0)
- {
- int* p = (int*)SeqList_Delete(list, 0);
- printf("%d\n", *p);
- }
- SeqList_Destroy(list);
- return 0;
- }
本文借鉴:http://blog.csdn.net/nethanhan/article/details/9670577
- 数据结构(13)线性表
- 数据结构(线性表)
- 数据结构(线性表)
- 数据结构(线性表)
- 数据结构(线性表)
- 数据结构(二)--线性表
- 数据结构(2线性表)
- 基本数据结构(线性表)
- 数据结构-线性表(2)
- 数据结构(线性表)-单链表
- 数据结构(一)---线性表
- 数据结构(一)线性表
- [数据结构]线性表(一)
- [数据结构]线性表(二)
- 【数据结构】线性表(一)
- 【数据结构】线性表(二)
- 数据结构线性表(1)
- 数据结构线性表(2)
- iOS UITextView 高度随文字自动增加,并跟随键盘移动(二)
- windows窗口销毁
- 【UESTC】【windy数】
- C++标准程序库笔记(1)
- 杭电 1711 Number Sequence kmp
- 数据结构(13)线性表
- 数学之最美公式
- Dragon Ball--hdoj
- Android的MediaPlayer架构介绍
- UI09_多种tableView
- 癌症晚期的妻子被丈夫威胁离婚后,居然有一位“备胎”站了出来
- mysql 创建用户
- 【笔试】15、输入三个整数x,y,z,请把这三个数由小到大输出。
- ubuntu 安装后要做的事情