静态链表

来源:互联网 发布:万网域名解析修改端口 编辑:程序博客网 时间:2024/06/05 03:49

编写中总结的几个问题:

  1. 初始化创建静态链表,令list.av == 0, 表示链表为空。list.av 正常应该指向可用剩余存储空间的第一个标号。
  2. 插入时首先判断插入位置pos是否满足要求,其次,应该注意首次插入元素时(list.av = 0),应做特殊处理,将第一个元素的cur域设置为0,标志是链表的最后一个元素,此外,在每次插入时,如果插入位置pos==1,则需要修改node[0].cur指向新插入的元素,此值始终指向链表中第一个有效元素的编号。
  3. 删除时,若删除的是链表中的第一个元素,则需要修改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
原创粉丝点击