亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

C語言實現靜態鏈表的方法

2020-01-26 16:20:34
字體:
來源:轉載
供稿:網友

在動手之前我一直以為靜態鏈表和動態鏈表沒有什么差別,細細一想才發現,原來靜態鏈表之中隱藏著一個非常值得討論的話題――內存管理。

靜態鏈表的“靜態”二字是指內存的來源為靜態內存(通常用全局數組)。與動態鏈表不同,在靜態鏈表中節點內存的申請與釋放都需要自行維護,由于這里是鏈表,也很容易想到將空余的節點鏈接起來形成一個free_list,每次需要時從free_list頭部取出一個節點,釋放時再將節點加到頭部,這樣就能夠非常容易的實現鏈表的其他操作。

復制代碼 代碼如下:

// 靜態鏈表 的實現
 #include <stdio.h>

 #define MAXN 16 // capacity of list.
 typedef int element; // element type.

 // define boolean type:
 typedef int bool;
 #define true -1
 #define false 0

 #define NPTR -1 // null pointer definition. can not between 0 to MAXN-1.
 typedef int pointer;

 #define DEBUGVAL(x) printf("%s: %d/n", #x, (x)); // a macro for debug.

 struct __node
 {
     element data;
     pointer next;
 }SLList[MAXN];
 pointer ifree, idata;

 #define nextof(p) SLList[p].next
 #define dataof(p) SLList[p].data

 #define _alloc(d) ifree; dataof(ifree)=(d); ifree != NPTR ? ifree=nextof(ifree) : NPTR
 #define _free(p)  nextof(p)=ifree; ifree = p

 void init()
 {
     int i;
     ifree = 0;
     idata = NPTR;
     for( i=0; i < MAXN-1; i++)
         nextof(i) = i+1;
     nextof(i) = NPTR;
 }

 // clear all nodes.
 void clear() { init(); }

 // push val to front.
 bool push_front(element val)
 {
     pointer tmp, np;
     if( ifree != NPTR ) {
         np = _alloc(val);
         nextof(np) = idata;
         idata = np;
         return true;
     }
     return false;
 }

 // push val to end of list.
 bool push_back(element val)
 {
     if( idata == NPTR ) { // 空表,直接寫入
         idata = _alloc(val);
         nextof(idata) = NPTR;
         return true;
     }
     if( ifree != NPTR ) { // 非空,先找到最后一個節點
         pointer last = idata, np;
         while( nextof(last) != NPTR ) last = nextof(last);       
         np = _alloc(val);
         nextof(np) = NPTR;
         nextof(last) = np;
         return true;
     }
     return false;
 }

 // insert val to after p pointed node.
 bool insert_after(pointer p, element val)
 {
     if( ifree != NPTR && p != NPTR ) {
         pointer pn = _alloc(val);
         nextof(pn) = nextof(p);
         nextof(p)  = pn;       
         return true;
     }
     return false;
 }

 // insert to the position in front of p.
 bool insert(pointer ptr, element val)
 {
     if( ifree == NPTR ) return false;  // 沒有結點,直接返回
     if( ptr == idata ) { // 有一個節點
         pointer np = _alloc(val);
         nextof(np) = idata;
         idata = np;   
         return true;
     }
     else { // 其他情況,先找 ptr 的前驅,再插入
         pointer p = idata;
         while(  p != NPTR ) {
             if( nextof(p) == ptr ) { // find p -- the prev node of ptr.
                 return insert_after(p, val); // insert val after p.           
             }
            p = nextof(p);
         }
     }
     return false;
 }

 // find element, return the prev node pointer.
 pointer find_prev(element val)
 {
     pointer p = idata;
     while(  p != NPTR ) {
         if( dataof( nextof(p) ) == val )
             return p;
         p = nextof(p);
     }
     return NPTR;
 }

 // find element, return the node  pointer.
 pointer find(element val)
 {
     pointer p = idata;
     while(  p != NPTR ) {
         if( dataof(p) == val ) return p;
         p = nextof(p);
     }
     return NPTR;
 }

 // pop front element.
 void pop_front()
 {
     if( idata != NPTR ) { // 將 data list 最前面的節點 移到 free list 上
 #if 0
         pointer p = idata;       
         idata = nextof(idata); // idata = nextof(idata);
         nextof(p) = ifree;  // SLList[p].next = ifree;
         ifree = p;
 #else
         pointer p = idata;
         idata = nextof(idata);
         _free(p);
 #endif
     }
 }

 // pop back element.
 void pop_back()
 {
     if( idata == NPTR ) return;
     if( nextof(idata) == NPTR ) { // only 1 node.
         nextof(idata) = ifree;
         ifree = idata;
         idata = NPTR;
     }
     else { // 找到最后一個節點 p,以及它的前驅 q.
         // TODO: find the last node p, and it's perv node q.
         pointer p = idata, q;
         while( nextof(p) != NPTR ) {
             q = p;
             p = nextof( p );
         }
         // remove *p to free list, update nextof(q) to NPTR.
         nextof(p) = ifree;
         ifree = p;
         nextof(q) = NPTR;
     }
 }

 void show()
 {
     pointer p = idata;
     for( ; p != NPTR; p = nextof(p) ) {
         printf(" %3d ", dataof(p) );
     }
     printf("/n");
 }

 #define INFOSHOW
 void info()
 {
 #ifdef INFOSHOW
     int i;   
     DEBUGVAL(ifree);
     DEBUGVAL(idata);
     puts("====================/n"
         "index/tdata/tnext/n"
         "--------------------");
     for(i=0; i<MAXN; i++) {
         printf("%d/t%d/t%d/n", i, SLList[i].data, SLList[i].next);
     }
     puts("====================/n");
 #endif
 }

 /*
     測試程序:
 */
 int main()
 {
     int i;
     init();

 #if 1  // push_front test:
     puts("push_front test:");
     for(i=0; i<MAXN+2; i++)    {
         push_front(2*i+1);
         show();   
     }

     puts("pop_front test:");
     for(i=0; i<MAXN+2; i++)    {
         pop_front();
         show();
     }
 #endif

 #if 1 // push_back test:
     puts("push_back test:");
     for(i=0; i<MAXN+2; i++)    {
         push_back((i+1)*10);
         show();   
     }

     puts("pop_back test:");
     for(i=0; i<MAXN+1; i++)
     {
         pop_back();
         show();
     }
 #endif

 #if 1 // insert test:
     puts("insert test:");
     for(i=0; i<MAXN+2; i++)
     {
         insert(idata, (i+1)*10);
         show();
     }
     puts("clear.../n");
     clear();
 #endif

 #if 1 // insert_after test:
     puts("insert_after test:");
     push_back(-99);
     for(i=0; i<MAXN+1; i++) {
         insert_after(idata, i+1);
         show();
     }
     puts("clear.../n");
     clear();
 #endif

 #if 1 // find test:
     puts("find test:");
     for(i=0; i<MAXN/2; i++) {
         push_front(MAXN-i);
         push_back(MAXN/2-i);
         //show();
     }
     show();
     info();
     for(i=0; i<MAXN; i++) {
         int val = rand()%(2*MAXN);
         pointer p = find(val);
         if( p != NPTR )
             printf("%3d %3d found at %d/n", val, dataof(p), p);
         else
             printf("%3d not found/n", val);
     }
 #endif

 #if 1
     puts("/nfind_prev test:");
     for(i=0; i<MAXN; i++) {
         int val = rand()%(2*MAXN);
         pointer p = find_prev(val);
         if( p != NPTR )
             printf("%3d %3d found at %d's next./n", val, dataof(nextof(p)), p);
         else
             printf("%3d not found/n", val);
     }
 #endif

 #if 1 // find_prev and insert_after test:
     clear();
     puts("/nfind_prev and insert_after test:");
     for(i=0; i<MAXN/2; i++)    {
         push_front(MAXN/2-i);
     }
     show();
     for(i=0; i<MAXN/2; i++) {
         int val = rand()%(2*MAXN), n=-(i+1);
         pointer p = find_prev(val);
         if( p != NPTR ) {
             printf("insert %d to front of %d:", n, val);
             insert_after(p, n);
             show();
         }
     }   
 #endif   

 #if 1 // find and insert test:
     clear();
     puts("/nfind and insert test:");
     for(i=0; i<MAXN/2; i++)    {
         push_front(MAXN/2-i);
     }
     show();
         for(i=0; i<MAXN/2; i++) {
         int val = rand()%MAXN, n=-(i+1);
         pointer p = find(val);
         if( p != NPTR ) {
             printf("insert %d to after of %d:", n, val);
             insert_after(p, n);
             show();
         }
     }
 #endif

     puts("end of main().");   
     return 0;
 }

 //

測試結果如下:


復制代碼 代碼如下:

push_front test:
    1
    3    1
    5    3    1
    7    5    3    1
    9    7    5    3    1
   11    9    7    5    3    1
   13   11    9    7    5    3    1
   15   13   11    9    7    5    3    1
   17   15   13   11    9    7    5    3    1
   19   17   15   13   11    9    7    5    3    1
   21   19   17   15   13   11    9    7    5    3    1
   23   21   19   17   15   13   11    9    7    5    3    1
   25   23   21   19   17   15   13   11    9    7    5    3    1
   27   25   23   21   19   17   15   13   11    9    7    5    3    1
   29   27   25   23   21   19   17   15   13   11    9    7    5    3    1
   29   27   25   23   21   19   17   15   13   11    9    7    5    3    1
   29   27   25   23   21   19   17   15   13   11    9    7    5    3    1
pop_front test:
   27   25   23   21   19   17   15   13   11    9    7    5    3    1
   25   23   21   19   17   15   13   11    9    7    5    3    1
   23   21   19   17   15   13   11    9    7    5    3    1
   21   19   17   15   13   11    9    7    5    3    1
   19   17   15   13   11    9    7    5    3    1
   17   15   13   11    9    7    5    3    1
   15   13   11    9    7    5    3    1
   13   11    9    7    5    3    1
   11    9    7    5    3    1
    9    7    5    3    1
    7    5    3    1
    5    3    1
    3    1
    1
 

 

push_back test:

   20
   20   30
   20   30   40
   20   30   40   50
   20   30   40   50   60
   20   30   40   50   60   70
   20   30   40   50   60   70   80
   20   30   40   50   60   70   80   90
   20   30   40   50   60   70   80   90  100
   20   30   40   50   60   70   80   90  100  110
   20   30   40   50   60   70   80   90  100  110  120
   20   30   40   50   60   70   80   90  100  110  120  130
   20   30   40   50   60   70   80   90  100  110  120  130  140
   20   30   40   50   60   70   80   90  100  110  120  130  140  150
   20   30   40   50   60   70   80   90  100  110  120  130  140  150  160
   20   30   40   50   60   70   80   90  100  110  120  130  140  150  160
   20   30   40   50   60   70   80   90  100  110  120  130  140  150  160
pop_back test:
   20   30   40   50   60   70   80   90  100  110  120  130  140  150
   20   30   40   50   60   70   80   90  100  110  120  130  140
   20   30   40   50   60   70   80   90  100  110  120  130
   20   30   40   50   60   70   80   90  100  110  120
   20   30   40   50   60   70   80   90  100  110
   20   30   40   50   60   70   80   90  100
   20   30   40   50   60   70   80   90
   20   30   40   50   60   70   80
   20   30   40   50   60   70
   20   30   40   50   60
   20   30   40   50
   20   30   40
   20   30
   20
 


insert test:

   10
   20   10
   30   20   10
   40   30   20   10
   50   40   30   20   10
   60   50   40   30   20   10
   70   60   50   40   30   20   10
   80   70   60   50   40   30   20   10
   90   80   70   60   50   40   30   20   10
  100   90   80   70   60   50   40   30   20   10
  110  100   90   80   70   60   50   40   30   20   10
  120  110  100   90   80   70   60   50   40   30   20   10
  130  120  110  100   90   80   70   60   50   40   30   20   10
  140  130  120  110  100   90   80   70   60   50   40   30   20   10
  150  140  130  120  110  100   90   80   70   60   50   40   30   20   10
  150  140  130  120  110  100   90   80   70   60   50   40   30   20   10
  150  140  130  120  110  100   90   80   70   60   50   40   30   20   10
clear...

insert_after test:
 -99    1
 -99    2    1
 -99    3    2    1
 -99    4    3    2    1
 -99    5    4    3    2    1
 -99    6    5    4    3    2    1
 -99    7    6    5    4    3    2    1
 -99    8    7    6    5    4    3    2    1
 -99    9    8    7    6    5    4    3    2    1
 -99   10    9    8    7    6    5    4    3    2    1
 -99   11   10    9    8    7    6    5    4    3    2    1
 -99   12   11   10    9    8    7    6    5    4    3    2    1
 -99   13   12   11   10    9    8    7    6    5    4    3    2    1
 -99   14   13   12   11   10    9    8    7    6    5    4    3    2    1
 -99   15   14   13   12   11   10    9    8    7    6    5    4    3    2    1
 -99   15   14   13   12   11   10    9    8    7    6    5    4    3    2    1
 -99   15   14   13   12   11   10    9    8    7    6    5    4    3    2    1
clear...

find test:
   10   11   12   13   14   15   16    8    7    6    5    4    3    2    1
ifree: -1
idata: 14
====================
index    data    next
--------------------
    16    1
    8    3
    15    0
    7    5
    14    2
    6    7
    13    4
    5    9
    12    6
    4    11
    11    8
    3    13
    10    10
    2    15
    9    12
    1    -1
====================
   9 found at 14
   3 found at 11
 not found
   4 found at 9
   1 found at 15
  12 found at 8
 not found
  14 found at 4
 not found
  16 found at 0
   9 found at 14
 not found
 not found
 not found
   9 found at 14
  11 found at 10

find_prev test:
 not found
   6 found at 3's next.
 not found
 not found
   7 found at 1's next.
  12 found at 10's next.
 not found
 not found
   4 found at 7's next.
 not found
  13 found at 8's next.
 not found
   6 found at 3's next.
 not found
   7 found at 1's next.
 not found

find_prev and insert_after test:
    2    3    4    5    6    7    8
insert -4 to front of 8:   1    2    3    4    5    6    7   -4    8
insert -5 to front of 3:   1    2   -5    3    4    5    6    7   -4    8
insert -8 to front of 6:   1    2   -5    3    4    5   -8    6    7   -4    8

find and insert test:
    2    3    4    5    6    7    8
insert -2 to after of 3:   1    2    3   -2    4    5    6    7    8
insert -6 to after of 8:   1    2    3   -2    4    5    6    7    8   -6
insert -7 to after of 5:   1    2    3   -2    4    5   -7    6    7    8   -6
end of main().

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
精品成人在线视频| 91精品国产亚洲| 欧美午夜片在线免费观看| 欧美日韩激情网| 久久久久久国产三级电影| 美女扒开尿口让男人操亚洲视频网站| 国产美女精品视频| 欧美另类老肥妇| 亚洲成人精品久久久| 2018中文字幕一区二区三区| 日韩成人激情视频| 自拍偷拍亚洲欧美| 国产有码在线一区二区视频| 一区二区在线视频播放| 性欧美激情精品| 97精品国产97久久久久久春色| 欧美精品在线视频观看| 九九热这里只有精品6| 成人激情综合网| 亚洲电影免费观看高清完整版| 国产成人精品国内自产拍免费看| 欧美成人精品影院| 国产精品自在线| 国产精品色婷婷视频| 中文字幕日韩精品有码视频| 欧美日韩国产123| 在线日韩第一页| 久久精品一区中文字幕| 91精品中国老女人| 国产精品欧美一区二区三区奶水| 久久久电影免费观看完整版| 欧美性猛交xxxx乱大交3| 色偷偷88888欧美精品久久久| 久久久亚洲欧洲日产国码aⅴ| 国产午夜精品麻豆| 久久精视频免费在线久久完整在线看| 日韩免费观看av| 欧美激情国产精品| 久久九九全国免费精品观看| 欧美激情视频免费观看| 欧美国产高跟鞋裸体秀xxxhd| 欧美成人国产va精品日本一级| 亚洲女人被黑人巨大进入| 中文字幕综合在线| 成人免费福利视频| 亚洲系列中文字幕| 欧美日韩在线免费| 日韩av综合网| 日本午夜在线亚洲.国产| www国产精品视频| 欧美亚洲一级片| 国产精品久久二区| 欧美性猛交xxxx乱大交蜜桃| 日韩视频免费观看| 丝袜美腿精品国产二区| 美女黄色丝袜一区| 欧美丝袜美女中出在线| 国产亚洲视频在线| 成人夜晚看av| 久久人体大胆视频| 91精品国产精品| 欧美亚洲国产视频| 国产91精品久久久久久| 国产成人在线一区二区| 精品自在线视频| 久久久久久香蕉网| 九九热视频这里只有精品| 亚洲福利视频专区| 亚洲第一男人av| 欧美国产在线电影| 欧美最猛性xxxxx(亚洲精品)| 日韩美女主播视频| 国产精品欧美激情| 黑人巨大精品欧美一区二区免费| 4p变态网欧美系列| 国产精品日韩专区| 午夜精品www| 91国产高清在线| 69久久夜色精品国产69乱青草| 中文字幕欧美在线| 日韩av免费在线看| 91黑丝在线观看| 国产香蕉97碰碰久久人人| 亚洲一区二区三区成人在线视频精品| 欧美小视频在线| 国产精品91久久久久久| 欧美激情在线有限公司| 久久亚洲综合国产精品99麻豆精品福利| 国产精品久久久久久久久久| 夜夜嗨av一区二区三区免费区| 欧美亚洲视频一区二区| 国产视频综合在线| 亚洲最大中文字幕| 中文字幕av一区中文字幕天堂| 欧美精品videossex性护士| 91在线免费视频| 色综合久久88| 国产欧美一区二区三区在线看| 国产精品香蕉在线观看| 国产精品视频在线观看| 在线日韩精品视频| 91成人免费观看网站| 国产精品老女人视频| 亚洲男人天堂2023| 亚洲欧美制服综合另类| 国产日产久久高清欧美一区| 久久久久久久电影一区| 久久久免费精品| 91精品国产色综合久久不卡98| 欧美第一淫aaasss性| 国产亚洲精品久久久久久| 亚洲精品中文字幕av| 欧美尤物巨大精品爽| 国产精品羞羞答答| 亚洲韩国日本中文字幕| 久久高清视频免费| 91精品国产色综合久久不卡98口| 97涩涩爰在线观看亚洲| 亚洲欧美精品中文字幕在线| 欧美激情网友自拍| 亚洲国产成人91精品| 国产精品美乳一区二区免费| 欧美亚洲国产日韩2020| 成人性生交大片免费看视频直播| 尤物99国产成人精品视频| 欧美亚洲在线观看| 亚洲精品aⅴ中文字幕乱码| 欧美午夜片欧美片在线观看| 亚洲国产成人在线播放| 久久精品这里热有精品| 久久精品中文字幕免费mv| 97**国产露脸精品国产| 精品国产一区二区三区久久狼黑人| 色与欲影视天天看综合网| 日韩欧美在线视频日韩欧美在线视频| 国产欧美一区二区三区久久| 欧美精品做受xxx性少妇| 一本大道久久加勒比香蕉| 国产一区香蕉久久| 中文字幕无线精品亚洲乱码一区| 欧美国产日韩中文字幕在线| 日韩成人激情在线| 国产精品7m视频| 亚洲free性xxxx护士白浆| 国产精品99久久99久久久二8| 国产综合在线看| 亚洲第一精品福利| 日韩av电影在线播放| 国产精品久久一| 亚洲精品免费一区二区三区| 久久精品最新地址| 成人国产精品久久久| 米奇精品一区二区三区在线观看| 国产精品麻豆va在线播放| 亚洲一区二区三区在线视频| 国产精品激情自拍| 91久久久久久久一区二区| 久久免费少妇高潮久久精品99| 2020国产精品视频| 欧美成人精品在线观看| 伊人久久久久久久久久久久久| 国产精品久久久久久亚洲调教| 国产精品69久久久久| 欧美日韩国产丝袜另类|