静态链表
来源:互联网 发布:什么是源码销售 编辑:程序博客网 时间:2024/06/15 19:10
今天下午学了一下午静态链表,花了将近两个小时才将静态链表学会。
静态链表的思想就是通过数组来模拟单链表的运行。以数组的下标来模拟指针的操作,因此又名游标实现法。
首先建立一个包含两个基本性质的元素,num和cur,num表示该链表每个单元中的储存数字,cur表示游标。
规定:
1.把未使用的位置视为备用链表。
2.把链表第1个位置(即下标为零处)视为备用链表的头指针,其游标指向第一个未使用位置的下标(如上图中下标为0处的为5的游标),数组最后一个元素(即数组最大限度处)视为储存数据的链表的头指针,其游标指向被第一个储存的数据的下标(即下标为999处的数字为1的游标)。
3.将两个链表最后一个元素的游标标记为0。
4.对这两处起头指针作用的数组位置来说,这两处不储存数字。
#include <stdio.h>#include <stdlib.h>#define true 1#define false 0#define MAX_SIZE 1000 // 储存链表的最大限度typedef int bool;typedef int ElemType;//定义静态链表的基本单元与表的基本框架typedef struct{ int num; int cur;}Node;
//初始化链表,因为链表的处理都是通过游标与下标的关系进行的,所以需要初始化各个位置上的游标,建立游标与下标的关系。
//第一步要将链表从i = 0到MAX_SIZE - 2该范围内的各个值都赋成i + 1;第二步将数组最后一个元素的游标指向第一个元素(因数组为空)
void InitList(Node L[]){ int i; for(int i = 0; i < MAX_SIZE - 2; ++i) { L[i].cur = i + 1; } L[MAX_SIZE - 1].cur = 0;}//验证链表是否为空bool ListEmpty(Node L[]){ if(L[MAX_SIZE - 1] = 0) { return true; } return false;}//清除整个链表void ClearList(Node L[]){ int i = L[MAX_SIZE - 1].cur; L[MAX_SIZE - 1].cur = 0; int k = L[0].cur; L[0].cur = i; int j; while(i) { j = L[i].cur; i = L[i].cur; } L[j] = k;}//获取储存链表中某位置上的元素void GetElem(Node L[], int i, ElemType *key){ int j = 1; int pos = L[MAX_SIZE - 1]; while(L[pos].cur&& j < i) { pos = L[pos].cur; j++; } if(j > i|| !L[pos].cur) { return false; } *key = L[pos].num;}//在链表中定位某个元素的位置int LocateElem(Node L[], ElemType e){ int j = 1; int pos = L[MAX_SIZE - 1]; while(L[pos].cur&& e != L[pos].num) { j++; pos = L[pos].cur; } if(e != L[pos].num) { return 0; } else { return j; }}//获取链表的长度int GetLen(Node L[]){ int j = 1, pos = L[MAX_SIZE - 1]; while(L[pos].cur) { j++; pos = L[pos].cur; } return j;}//获取数组中的未被利用的位置int Malloc(Node L[]){ int i = L[0].cur; if(L[0].cur) { L[0].cur = L[i].cur; } return i;}//向链表某位置上插入一个元素int ListInsert(Node L[], int index, ElemType e){ if(index < 1|| index > Getlen(L)) return false;//如果插入的位置不在链表大小范围内,则失败 int n, mov, i; mov = MAX_SIZE - 1; n = Malloc(L);//找到第一个未用的位置并将位置为0的游标设置为备用链表的下一个位置的下标 if(n) { L[n].num = e; for(i = 1; i < index; ++i) mov = L[mov].cur; L[n].cur = L[mov].cur; L[mov].cur = n; return true; }//调节相关位置的游标使新插入的元素插入到了正确位置。 return false;}//将链表中某个位置上的元素释放,将之归为备用数组中void Free(Node L[], int pos){ L[pos].cur = L[0].cur; L[0].cur = pos;}//删除链表中某个位置上的元素int ListDelete(Node L[], int i, ElemType *e){ if(i < 1|| i > GetLen(L)) return false; int pos = L[MAX_SIZE - 1].cur, j = 1; for(; j < i - 1; j++) { pos = L[pos].cur; } int mid = L[pos].cur; L[pos].cur = L[mid].cur; Free(L, mid); return true;}int main(){ Node List[MAX_SIZE];}
阅读全文
0 0
- 静态链表
- VB静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表实例
- 静态链表
- 静态链表。实现。
- 静态链表
- 静态链表
- 静态链表例子
- 静态链表模版
- 静态链表
- 【数据结构】静态链表
- 静态链表
- 静态链表
- to_datetime(*args, **kwargs)
- Ceph性能测试工具和方法。
- orcale ora-12541:tns:no listener
- 那些年我看的前端书籍
- sqlite 数据重复写入问题
- 静态链表
- 欢迎使用CSDN-markdown编辑器
- ==和equal的区别
- Android线程操作类(暂停、重新开启、停止)
- spring通过@Configuration @Bean注入Bean
- 又是新的挑战
- bzoj2100 [Usaco2010 Dec]Apple Delivery(slf优化的spfa)
- Java中CAS详解(转)
- 数据分析的统计方法选择小结(变量之间的关联性分析)