第九课,静态链表
来源:互联网 发布:xbox你的网络尚未设置 编辑:程序博客网 时间:2024/06/06 00:43
专题三:渐入佳境。包括以下章节:
- 无招胜有招-静态链表
- 气宗门道-循环链表
- 剑宗门道-双向链表
- 课后练习
思考
单链表完美解决了顺序表的问题!还有其它改进顺序表的方法吗?
单链表的相对劣势
单链表的实现严重依赖指针!
数据元素中必须包含一个额外的指针域!
没有指针的程序设计语言无法实现!
顺序表的改进
静态链表的定义
- 顺序表数组中的元素由两个数据域组成:data和next
- data域用于存储数据
- next域用于存储下一个元素在数组中的下标
静态链表的逻辑结构
静态链表是在顺序表的基础上利用数组实现的单链表!
静态链表相关定义
结点结构体定义
typedef struct _tag_StaticListNode{ unsigned int data; int next;}TStaticListNode;
静态链表结构体定义
typedef struct _tag_StaticList{ int capacity; TStaticListNode header; TStaticListNode node[];}TStaticList;
静态链表操作
1.获取第pos个元素操作
- 判断线性表是否合法
- 判断位置是否合法
- 由表头开始通过next域移动pos次后,当前元素的next域即要获取元素在数组中的下标
sList->node[0] = sList->header;for(i=0;i<pos;i++){ current = sList->node[current].next;}object = sList->node[current].next;
2.插入元素到位置pos操作
- 判断线性表是否合法
- 判断插入位置是否合法
- 在数组中查找空闲位置index
- 由表头开始通过next域移动pos次后,当前元素的next域为要插入的位置
- 将新元素插入
- 线性表长度加1
for(i=0;(i<pos)&&(sList->node[current].next != 0);i++){ current = sList->node[current].next;}sList->node[index].next = sList->node[current].next;sList->node[current].next = index
3.删除第pos个元素操作
- 判断线性表是否合法
- 判断删除位置是否合法
- 获取第pos个元素
- 将第pos个元素从链表中删除
- 线性表长度减1
小结
- 静态链表其实是单链表的另一种实现方式
- 静态链表的实现“媒介”不是指针而是数组
- 静态链表主要用于不支持指针的程序设计语言中
- 静态链表的实现是一种内存管理的简易方法
创建可复用静态链表
StaticList.h
#ifndef _STATICLIST_H_#define _STATICLIST_H_typedef void StaticList;typedef void StaticListNode;StaticList* StaticList_Create(int capacity);void StaticList_Destroy(StaticList* list);void StaticList_Clear(StaticList* list);int StaticList_Length(StaticList* list);int StaticList_Capacity(StaticList* list);int StaticList_Insert(StaticList* list, StaticListNode* node, int pos);StaticListNode* StaticList_Get(StaticList* list, int pos);StaticListNode* StaticList_Delete(StaticList* list, int pos);#endif
StaticList.c
#include <stdio.h>#include <malloc.h>#include "StaticList.h"#define AVAILABLE -1typedef struct _tag_StaticListNode{ unsigned int data; int next;} TStaticListNode;typedef struct _tag_StaticList{ int capacity; TStaticListNode header; TStaticListNode node[];} TStaticList;StaticList* StaticList_Create(int capacity) // O(n){ TStaticList* ret = NULL; int i = 0; if( capacity >= 0 ) { ret = (TStaticList*)malloc(sizeof(TStaticList) + sizeof(TStaticListNode) * (capacity + 1)); } if( ret != NULL ) { ret->capacity = capacity; ret->header.data = 0; ret->header.next = 0; for(i=1; i<=capacity; i++) { ret->node[i].next = AVAILABLE; } } return ret;}void StaticList_Destroy(StaticList* list) // O(1){ free(list);}void StaticList_Clear(StaticList* list) // O(n){ TStaticList* sList = (TStaticList*)list; int i = 0; if( sList != NULL ) { sList->header.data = 0; sList->header.next = 0; for(i=1; i<=sList->capacity; i++) { sList->node[i].next = AVAILABLE; } }}int StaticList_Length(StaticList* list) // O(1){ TStaticList* sList = (TStaticList*)list; int ret = -1; if( sList != NULL ) { ret = sList->header.data; } return ret;}int StaticList_Capacity(StaticList* list) // O(1){ TStaticList* sList = (TStaticList*)list; int ret = -1; if( sList != NULL ) { ret = sList->capacity; } return ret;}int StaticList_Insert(StaticList* list, StaticListNode* node, int pos) // O(n){ TStaticList* sList = (TStaticList*)list; int ret = (sList != NULL); int current = 0; int index = 0; int i = 0; ret = ret && (sList->header.data + 1 <= sList->capacity); ret = ret && (pos >=0) && (node != NULL); if( ret ) { for(i=1; i<=sList->capacity; i++) { if( sList->node[i].next == AVAILABLE ) { index = i; break; } } sList->node[index].data = (unsigned int)node; sList->node[0] = sList->header; for(i=0; (i<pos) && (sList->node[current].next != 0); i++) { current = sList->node[current].next; } sList->node[index].next = sList->node[current].next; sList->node[current].next = index; sList->node[0].data++; sList->header = sList->node[0]; } return ret;}StaticListNode* StaticList_Get(StaticList* list, int pos) // O(n){ TStaticList* sList = (TStaticList*)list; StaticListNode* ret = NULL; int current = 0; int object = 0; int i = 0; if( (sList != NULL) && (0 <= pos) && (pos < sList->header.data) ) { sList->node[0] = sList->header; for(i=0; i<pos; i++) { current = sList->node[current].next; } object = sList->node[current].next; ret = (StaticListNode*)(sList->node[object].data); } return ret;}StaticListNode* StaticList_Delete(StaticList* list, int pos) // O(n){ TStaticList* sList = (TStaticList*)list; StaticListNode* ret = NULL; int current = 0; int object = 0; int i = 0; if( (sList != NULL) && (0 <= pos) && (pos < sList->header.data) ) { sList->node[0] = sList->header; for(i=0; i<pos; i++) { current = sList->node[current].next; } object = sList->node[current].next; sList->node[current].next = sList->node[object].next; sList->node[0].data--; sList->header = sList->node[0]; sList->node[object].next = AVAILABLE; ret = (StaticListNode*)(sList->node[object].data); } return ret;}
main.c
#include <stdio.h>#include <stdlib.h>#include "StaticList.h"/* run this program using the console pauser or add your own getch, system("pause") or input loop */int main(int argc, char *argv[]){ StaticList* list = StaticList_Create(10); int index = 0; int i = 0; int j = 1; int k = 2; int x = 3; int y = 4; int z = 5; StaticList_Insert(list, &i, 0); StaticList_Insert(list, &j, 0); StaticList_Insert(list, &k, 0); for(index=0; index<StaticList_Length(list); index++) { int* p = (int*)StaticList_Get(list, index); printf("%d\n", *p); } printf("\n"); while( StaticList_Length(list) > 0 ) { int* p = (int*)StaticList_Delete(list, 0); printf("%d\n", *p); } printf("\n"); StaticList_Insert(list, &x, 0); StaticList_Insert(list, &y, 0); StaticList_Insert(list, &z, 0); printf("Capacity: %d Length: %d\n", StaticList_Capacity(list), StaticList_Length(list)); for(index=0; index<StaticList_Length(list); index++) { int* p = (int*)StaticList_Get(list, index); printf("%d\n", *p); } StaticList_Destroy(list); return 0;}
阅读全文
0 0
- 第九课,静态链表
- 第九课 静态代码块和对象初始化过程
- 数据结构教程 第九课 循环链表与双向链表
- 第九课 适配器模式
- 第九课 字符串比较
- 第九课学习
- 吉他第九课
- Java第九课
- C语言第九课
- OC第九课
- 第九课:SDL计时器
- 第九课 输出语句
- 第九课:VBO索引
- 第九课 right部分
- 第九次课总结
- 第九课 Learing Theory
- 第九课 协同程序
- 数据库学习第九课
- UVA 714 Copying Books (二分)
- VMware下对Ubuntu进行扩充磁盘大小
- android中的存储问题
- 人工智能编程马拉松
- js中如何添加一个事件监听addEventListener
- 第九课,静态链表
- 并查集_ 模板
- 319Bulb Switcher
- CSS学习
- check_user.sh
- 使用Spring特性实现接口多实现类的动态调用
- android安卓根据地名查找经纬度(百度地图)
- bootstrap layer.open中end的使用
- 中文分词研究入门