静态链表
来源:互联网 发布:万网域名解析修改端口 编辑:程序博客网 时间:2024/06/05 03:49
编写中总结的几个问题:
- 初始化创建静态链表,令list.av == 0, 表示链表为空。list.av 正常应该指向可用剩余存储空间的第一个标号。
- 插入时首先判断插入位置pos是否满足要求,其次,应该注意首次插入元素时(list.av = 0),应做特殊处理,将第一个元素的cur域设置为0,标志是链表的最后一个元素,此外,在每次插入时,如果插入位置pos==1,则需要修改node[0].cur指向新插入的元素,此值始终指向链表中第一个有效元素的编号。
- 删除时,若删除的是链表中的第一个元素,则需要修改node[0].cur指向删除元素的下一个元素,此外注意释放空间时的操作,将删除结点纳入可用空间,注意修改list.av 的值。
// 静态链表.cpp : 定义控制台应用程序的入口点。/**利用数组实现的静态链表,涉及的操作主要有:初始化链表分配空间释放空间插入元素删除元素查找元素思路:标号为0的元素的cur域存储的是链表第一个原色的存储单元编号,借助了av表示当前可用的存储单元标号*/#include "stdafx.h"#include "stdio.h"#include "stdlib.h"#define MAXSIZE 20#define true 1#define false 0typedef int dataType;typedef struct sNode{dataType data;int cur;//用于指示下一个元素在静态链表中位置的游标}sNode;typedef struct sList{sNode nodeList[MAXSIZE];int av;//指示下一个可用的存储标号} sList;void sListInit(sList *list);int AssignNode(sList *list);void FreeNode(sList *list, int curNum);int InsertElem(sList *list, int pos, dataType e);void DelateElem(sList *list, int pos, dataType *e);void PrintList(sList *list);int ListLength(sList *list);void sListInit(sList *list){int i;for(i=0;i<MAXSIZE;i++){(*list).nodeList[i].cur = i+1;}(*list).nodeList[MAXSIZE - 1].cur = 0;//最后一个结点的游标指向0,可作为判断满的标志?(*list).av = 0;//!!!!注意初始化时 链表为空 av = 0}int AssignNode(sList *list){//返回可用地址的序号int i;i = (*list).av;if(i)//i==0表示已经无可用空间(*list).av = (*list).nodeList[i].cur;//相当于指针移位,指向下一个可用地址return i;}void FreeNode(sList *list, int curNum){(*list).nodeList[curNum].cur = (*list).av;(*list).av = curNum;}int InsertElem(sList *list, int pos, dataType e){int i,j,k;if(pos < 1 || (pos > ListLength(list)+1))return false;i = AssignNode(list);//分配空间if(i == 0){ // first elemi = 1;(*list).nodeList[i].data = e;(*list).av = (*list).nodeList[i].cur;(*list).nodeList[i].cur = 0;//cur==0表示是链表的最后一个结点!!!!!!(*list).nodeList[0].cur = i;//nodeList[0].cur 始终指向链表的第一个结点标号}else{(*list).nodeList[i].data = e;j = (*list).nodeList[0].cur; //j指向第一个结点的标号for(k=1;k<pos-1;k++){ //指向第POS-1个元素游标j = (*list).nodeList[j].cur;}(*list).nodeList[i].cur = (*list).nodeList[j].cur;//改变指向(*list).nodeList[j].cur = i;if(pos == 1){(*list).nodeList[0].cur = k;}}return true;}int ListLength(sList *list){int count;int i;i = (*list).nodeList[0].cur;//指向第一个结点count = 0;while(i){i = (*list).nodeList[i].cur;count++;}return count;}void DelateElem(sList *list, int pos, dataType *e){int i,j,k;if(pos<1 || pos > ListLength(list))return;i = (*list).nodeList[0].cur;//j指向第一个结点的标号if(pos == 1){//如果删除的是第一个结点,要做特殊处理nodeList[0].cur始终指向第一个节点(*list).nodeList[0].cur = (*list).nodeList[i].cur;FreeNode(list,i);//(*list).nodeList[i].cur = (*list).av;//(*list).av = i;}else{for(j=1;j<pos-1;j++){ //指向POS-1元素游标i = (*list).nodeList[i].cur;}k = (*list).nodeList[i].cur;//k为要删除的元素的游标(*list).nodeList[i].cur = (*list).nodeList[k].cur;*e = (*list).nodeList[k].data;FreeNode(list,k);//(*list).nodeList[k].cur = (*list).av;//(*list).av = k;}}void PrintList(sList *list){int i;i=(*list).nodeList[0].cur;while(i != 0){printf("%4d",(*list).nodeList[i].data);i = (*list).nodeList[i].cur;}printf("\n");//printf("%4d",(*list).nodeList[i].data);}int _tmain(int argc, _TCHAR* argv[]){char end;dataType e;sList list;sListInit(&list);int i;for(i=1;i<11;i++){if(false == InsertElem(&list,i,i)){ printf("空间不足,链表长度%d",i-1);break;}}PrintList(&list);DelateElem(&list,11,&e);InsertElem(&list,5,55);PrintList(&list);i = ListLength(&list);end = getchar();return 0;}
0 0
- 静态链表
- VB静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表
- 静态链表实例
- 静态链表
- 静态链表。实现。
- 静态链表
- 静态链表
- 静态链表例子
- 静态链表模版
- 静态链表
- 【数据结构】静态链表
- 静态链表
- 静态链表
- 并发编程 — 详解线程池
- Java基础知识点总结七
- 各开源框架使用与设计总结(二)
- Java中多线程总结
- 安卓应用运营知识:VersionCode和VersionName
- 静态链表
- Java中输入输出流方法总结
- 投影纹理映射(Projective Texture Mapping)
- Linux环境编程之IPC进程间通信(四):管道和FIFO比较
- Java中集合类用法总结
- 你真的懂GCD吗?
- BZOJ 1615: [Usaco2008 Mar]The Loathesome Hay Baler麻烦的干草打包机
- Java中final关键字用法总结
- Solr Suggest实现搜索智能提示