设为首页 加入收藏

TOP

能判断是否还有剩余空间的静态链表(一)
2017-10-12 17:39:28 】 浏览:5852
Tags:判断 是否 还有 剩余 空间 静态

静态链表的概念:

    由于一些语言, 如Basic, Fortran等早期的编程高级语言没有指针, 像链式存储结构快速的删除,插入操作而无法完成.

所以就有人想出了数组代替指针.

    首先让数组的元素都是由两个数据域组成, data与cur. 也就是说, 数组的每个下标都对应一个data和一个cur. 数据域data,用来储存数据元素, 而游标的cur相当于单链表的next指针, 存放该元素的后继在数组中的下标.

 

许多书有关静态链表的描述和代码发现都没有判断是否还有剩余空间,于是自己写了一个.

Malloc_SL()函数里添加了是否还有剩余空间的判断.
输出结果:

即:
静态链表有效空间为 MAXSIZE-2 (除去 第一个位置(L[0].cur指向空余空间]) 和 最后一个位置(L[MAXSIZE-1].cur指向第一个结点))
  1 #include <stdio.h>      //Anjaxs
  2 #include <stdbool.h>
  3 #define MAXSIZE  7      
  4 typedef  int ElemType;
  5 
  6 typedef struct{
  7     ElemType data;
  8     int cur;
  9 }StaticList;
 10 
 11 int Malloc_SL(StaticList * space);
 12 void Free_SL(StaticList * space, int k);
 13 void InitList(StaticList * space); 
 14 bool ListInsert(StaticList * L, int i, ElemType e);
 15 bool ListDelete(StaticList * L, int i);
 16 int ListLength(StaticList * L);
 17 void show(StaticList * L);
 18 
 19 
 20 int main()
 21 {
 22     int i;
 23     int choice;
 24     StaticList L[MAXSIZE];
 25     InitList(L);
 26     printf("1:插入 2:删除 3:输出 0:退出\n");
 27     while (scanf("%d",&choice) && choice!=0)
 28     {
 29         int x;
 30         int pos;
 31         switch (choice)
 32         {
 33             case 1:
 34                 printf("输入要插入的数字和位置\n");
 35                 scanf("%d %d", &x, &pos);
 36                 ListInsert(L, pos, x);
 37                 break;
 38             case 2:
 39                 printf("输入要删除的位置\n");
 40                 scanf("%d",&pos);
 41                 ListDelete(L, pos);
 42                 break;
 43             case 3:
 44                 show(L);
 45                 break;
 46             default:
 47                 printf("请输入1-3.\n");
 48                 break;
 49         }
 50         printf("1:插入 2:删除 3:输出 0:退出\n");
 51     }
 52 
 53     return 0;
 54 }
 55 
 56 
 57 void InitList(StaticList *space)
 58 {
 59     int i;
 60     //space[0].cur为指向第一个空闲位置的指针
 61     //space[MAXSIZE-1].cur为头指针
 62     for (i = 0; i < MAXSIZE-1; ++i){
 63         space[i].data = 0;
 64         space[i].cur = i+1;
 65     }
 66     //目前静态链表为空,最后一个元素的cur为0
 67     space[MAXSIZE-1].cur = 0;
 68     space[MAXSIZE-1].data = 0;
 69 }
 70 
 71 bool ListInsert(StaticList *L, int i, ElemType e)
 72 {
 73     int j, k, l;
 74     k = MAXSIZE-1;
 75     if (i < 1 || i > ListLength(L)+1){
 76         printf("请输入合法的位置。\n");
 77         return false;
 78     }
 79     
 80     j = Malloc_SL(L);
 81     if (j){
 82         L[j].data = e;
 83         for (l = 1; l <= i-1; ++l)
 84             k = L[k].cur;
 85         L[j].cur = L[k].cur;
 86         L[k].cur = j;
 87         return true;
 88     }else{   
 89         //返回0则代表没有剩余空间
 90         printf("没有空闲空间了。\n");
 91         return false;
 92     }
 93 }
 94 
 95 bool ListDelete(StaticList * L, int i)
 96 {
 97     int j, k;
 98     if (i < 1 || i > ListLength(L)){
 99         printf("请输入合法的位置。\n");
100         return false;
101     }
102     k = MAXSIZE-1;
103     for (j = 1; j <= i-1; ++j)
104         k = L[k].cur;
105     j = L[k].cur;
106     L[k].cur = L[j].cur;
107     Free_SL(L,j);
108     return true;
109 }
110 
111 int ListLength(StaticList * L)
112 {
113     int j = 0;
114     int i = L[MAXSIZE-1].cur;
115     while (i)
116     {
117         i = L[i].cur;
118         j++;
119     }
120 
121     return j;
122 }
123 
124 int Malloc_SL(StaticList * space)
125 {
126     //返回第一个备用空闲的下标
127     int i = space[0].cur;
128 
129     if (space[0].cur != MAXSIZE-1){  
130         space[0].cur = space[i].cur;
131         return i;
132     }
133     else{
134 /*当(指向空余空间的指针) 指向 (指向头结点的指针) 时代表静态链表已满*/
135         return 0; 
136     }
137 }
138 
139 void Free_SL(StaticList * space, int k)
140 {
141     space[k].cur = space[0].cur;
142     space[0].cur = k;
143 }
144 
145 void show(StaticList * L)
146 {
147     int i;
148
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇9. Palindrome Number 下一篇[转]C语言切割多层字符串(strtok_..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目