线性表实例
2015-08-02 20:08
267 查看
线性表的本质:
专业的定义:
性质:
线性表的操作
线性表的顺序存储结构
优缺点
实例如下:
//Makefile
由0个或多个数据元素组成的集合 数据元素之间是顺序的 数据元素个数是有限的 数据元素的类型必须是相同的
专业的定义:
线性表是具有相同类型的n(n>=0)个数据元素的有限序列(a0,a1,a2,...an) ai是表项,n是长度
性质:
a0为线性表中的第一个元素,只有一个后继 an为线性表中的最后一个元素,只有一个前驱 除了a0和an之外的其他元素ai,既有一个直接前驱,也有一个直接后继 线性表能够逐项访问和顺序存取
线性表的操作
创建 销毁 //销毁这个序列, 清空 //有这个序列,但都被清空 删除 插入 获取表中某个位置的数据元素 获得线性表的长度
线性表的顺序存储结构
线性表的顺序结构指的是用一段地址连续的存储单元依次存储线性表的数据元素
优缺点
优点:可以快速的获得表中的数据 缺点:增加和删除的时候会有大量的节点移动
实例如下:
//seqlist.h文件 #ifndef __SEQLIST_H__ #define __SEQLIST_H__ typedef unsigned int SeqListNode; typedef struct _list { int capacity; //最大容量 int length; //当前元素个数 SeqListNode *node; //起始地址 }SeqList; 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_H__
//seqlist.c文件 #include <stdlib.h> #include "seqlist.h" SeqList *SeqList_Create(int capacity) { SeqList *ret = NULL; if(capacity >= 0) { ret = malloc(sizeof(SeqList) + sizeof(SeqListNode)*capacity); } if(ret != NULL) { ret->capacity = capacity; ret->length = 0; ret->node = (SeqListNode *)(ret+1); } return ret; } void SeqList_Destroy(SeqList *list) { free(list); } void SeqList_Clear(SeqList *list) { if(list != NULL) list->length = 0; //当前元素个数 } int SeqList_Length(SeqList *list) { int ret = -1; if(list != NULL) { ret = list->length; } return ret; } int SeqList_Capacity(SeqList *list) { int ret = -1; if( list != NULL ) ret = list->capacity; return ret; } int SeqList_Insert(SeqList *list,SeqListNode *node,int pos) { int i; int ret = (list!=NULL) && (node!=NULL); ret = ret && (pos>=0) && (list->length+1<=list->capacity); if( ret ) { if( pos > list->length ) pos = list->length; for( i=list->length;i>pos;i-- ) { list->node[i] = list->node[i-1]; } list->node[i] = (unsigned int)node; //这里只能是i,不能是pos,也不能是length,这里是指针强转换为int型,经常这样做, list->length++; } return ret; } SeqListNode *SeqList_Get(SeqList *list,int pos) { SeqListNode *ret = NULL; if( list!=NULL && (0<=pos && pos<list->length) ) { ret = (SeqListNode *)(list->node[pos]); } return ret; } SeqListNode *SeqList_Delete(SeqList *list,int pos) { int i; SeqListNode *ret = SeqList_Get(list,pos); if( ret!=NULL ) { for(i=pos+1; i<=list->length; i++) { list->node[i-1] = list->node[i]; } list->length--; } return ret; }
//main.c #include <stdio.h> #include <stdlib.h> #include "seqlist.h" int main( void ) { int i; int j; int a[10] = {}; SeqList *list = SeqList_Create(10); printf("Capacit = %d\n",SeqList_Capacity(list)); printf("length = %d\n",SeqList_Length(list)); for(i=0;i<10;i++) { a[i] = i+1; SeqList_Insert(list, a+i, 0); for(j=0; j<SeqList_Length(list); j++) { printf("%d ",*SeqList_Get(list,j)); } printf("\n"); } while (SeqList_Length(list) > 0) { int *ret = (int *)SeqList_Delete(list,0); printf("d %d\n",*ret); } SeqList_Destroy(list); return 0; }
//Makefile
.PHONY : main clean CC=gcc -g main:main.o seqlist.o $(CC) $^ -o $@ clean: rm -rf *.o main
相关文章推荐
- 51Nod 1189 阶乘分数 (数论)
- 第二篇T语言实例开发(版本5.3),福彩3D摇号器
- 【LeetCode】223 - Rectangle Area
- angularjs源码阅读——injector
- angularjs源码阅读——invokeLater
- gtk+修改控件文本字体一例
- gtk+修改控件文本字体一例
- LeetCode #65 Valid Number
- gtk+修改控件文本字体一例
- 手机模板修改
- STM32F030 WWDG使用结论
- 欢迎使用CSDN-markdown编辑器
- 【暑假集训】之被ACM金牌大神虐的第三天之树形dp篇
- HDU 2187 悼念512汶川大地震遇难同胞——老人是真饿了【贪心】
- Java内存管理原理及内存区域详解
- java中的异常详解
- 解决Sublime Text 2中文显示乱码的问题
- leetcode 62: Unique Paths
- 小白鼠与毒药解题过程分析
- Java语言程序设计进阶----第四周作业