zoukankan      html  css  js  c++  java
  • 静态链表

    顺序链表的缺陷

    1.单链表的实现严重依赖指针
    2.数据元素中必须包含一个额外的指针域
    3.没有指针的程序设计语言无法实现

      1 #include <stdio.h>
      2 #include <malloc.h>
      3 #include "StaticList.h"
      4 
      5 #define AVAILABLE -1
      6 
      7 typedef struct _tag_StaticListNode
      8 {
      9     unsigned int data;
     10     int next;
     11 } TStaticListNode;
     12 
     13 typedef struct _tag_StaticList
     14 {
     15     int capacity;
     16     TStaticListNode header;
     17     TStaticListNode node[];
     18 } TStaticList;
     19 
     20 StaticList* StaticList_Create(int capacity) // O(n)
     21 {
     22     TStaticList* ret = NULL;
     23     int i = 0;
     24     
     25     if( capacity >= 0 )
     26     {
     27         ret = (TStaticList*)malloc(sizeof(TStaticList) + sizeof(TStaticListNode) * (capacity + 1));
     28     }
     29     
     30     if( ret != NULL )
     31     {
     32         ret->capacity = capacity;
     33         ret->header.data = 0;
     34         ret->header.next = 0;
     35         
     36         for(i=1; i<=capacity; i++)
     37         {
     38             ret->node[i].next = AVAILABLE;
     39         }
     40     }
     41     
     42     return ret;
     43 }
     44 
     45 void StaticList_Destroy(StaticList* list) // O(1)
     46 {
     47     free(list);
     48 }
     49 
     50 void StaticList_Clear(StaticList* list) // O(n)
     51 {
     52     TStaticList* sList = (TStaticList*)list;
     53     int i = 0;
     54     
     55     if( sList != NULL )
     56     {
     57         sList->header.data = 0;
     58         sList->header.next = 0;
     59         
     60         for(i=1; i<=sList->capacity; i++)
     61         {
     62             sList->node[i].next = AVAILABLE;
     63         }
     64     }
     65 }
     66 
     67 int StaticList_Length(StaticList* list) // O(1)
     68 {
     69     TStaticList* sList = (TStaticList*)list;
     70     int ret = -1;
     71     
     72     if( sList != NULL )
     73     {
     74         ret = sList->header.data;
     75     }
     76     
     77     return ret;
     78 }
     79 
     80 int StaticList_Capacity(StaticList* list) // O(1)
     81 {
     82     TStaticList* sList = (TStaticList*)list;
     83     int ret = -1;
     84     
     85     if( sList != NULL )
     86     {
     87         ret = sList->capacity;
     88     }
     89     
     90     return ret;
     91 }
     92 
     93 int StaticList_Insert(StaticList* list, StaticListNode* node, int pos)  // O(n)
     94 {
     95     TStaticList* sList = (TStaticList*)list;
     96     int ret = (sList != NULL);
     97     int current = 0;
     98     int index = 0;
     99     int i = 0;
    100     
    101     ret = ret && (sList->header.data + 1 <= sList->capacity);
    102     ret = ret && (pos >=0) && (node != NULL);
    103     
    104     if( ret )
    105     {
    106         for(i=1; i<=sList->capacity; i++)
    107         {
    108             if( sList->node[i].next == AVAILABLE )
    109             {
    110                 index = i;
    111                 break;
    112             }
    113         }
    114         
    115         sList->node[index].data = (unsigned int)node;
    116         
    117         sList->node[0] = sList->header;
    118         
    119         for(i=0; (i<pos) && (sList->node[current].next != 0); i++)
    120         {
    121             current = sList->node[current].next;
    122         }
    123         
    124         sList->node[index].next = sList->node[current].next;
    125         sList->node[current].next = index;
    126         
    127         sList->node[0].data++;
    128         
    129         sList->header = sList->node[0];
    130     }
    131     
    132     return ret;
    133 }
    134 
    135 StaticListNode* StaticList_Get(StaticList* list, int pos)  // O(n)
    136 {
    137     TStaticList* sList = (TStaticList*)list;
    138     StaticListNode* ret = NULL;
    139     int current = 0;
    140     int object = 0;
    141     int i = 0;
    142     
    143     if( (sList != NULL) && (0 <= pos) && (pos < sList->header.data) )
    144     {
    145         sList->node[0] = sList->header;
    146         
    147         for(i=0; i<pos; i++)
    148         {
    149             current = sList->node[current].next;
    150         }
    151         
    152         object = sList->node[current].next;
    153         
    154         ret = (StaticListNode*)(sList->node[object].data);
    155     }
    156     
    157     return ret;
    158 }
    159 
    160 StaticListNode* StaticList_Delete(StaticList* list, int pos) // O(n)
    161 {
    162     TStaticList* sList = (TStaticList*)list;
    163     StaticListNode* ret = NULL;
    164     int current = 0;
    165     int object = 0;
    166     int i = 0;
    167     
    168     if( (sList != NULL) && (0 <= pos) && (pos < sList->header.data) )
    169     {
    170         sList->node[0] = sList->header;
    171         
    172         for(i=0; i<pos; i++)
    173         {
    174             current = sList->node[current].next;
    175         }
    176         
    177         object = sList->node[current].next;
    178         
    179         sList->node[current].next = sList->node[object].next;
    180         
    181         sList->node[0].data--;
    182         
    183         sList->header = sList->node[0];
    184         
    185         sList->node[object].next = AVAILABLE;
    186         
    187         ret = (StaticListNode*)(sList->node[object].data);
    188     }
    189     
    190     return ret;
    191 }
    #ifndef _STATICLIST_H_
    #define _STATICLIST_H_
    
    typedef void StaticList;
    typedef void StaticListNode;
    
    StaticList* StaticList_Create(int capacity);
    
    void StaticList_Destroy(StaticList* list);
    
    void StaticList_Clear(StaticList* list);
    
    int StaticList_Length(StaticList* list);
    
    int StaticList_Capacity(StaticList* list);
    
    int StaticList_Insert(StaticList* list, StaticListNode* node, int pos);
    
    StaticListNode* StaticList_Get(StaticList* list, int pos);
    
    StaticListNode* StaticList_Delete(StaticList* list, int pos);
    
    #endif
     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 #include "StaticList.h"
     4 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
     5 
     6 int main(int argc, char *argv[])
     7 {
     8     StaticList* list = StaticList_Create(10);
     9     
    10     int index = 0;
    11     
    12     int i = 0;
    13     int j = 1;
    14     int k = 2;
    15     int x = 3;
    16     int y = 4;
    17     int z = 5;
    18     
    19     StaticList_Insert(list, &i, 0);
    20     StaticList_Insert(list, &j, 0);
    21     StaticList_Insert(list, &k, 0);
    22     
    23     for(index=0; index<StaticList_Length(list); index++)
    24     {
    25         int* p = (int*)StaticList_Get(list, index);
    26         
    27         printf("%d
    ", *p);
    28     }
    29     
    30     printf("
    ");
    31     
    32     while( StaticList_Length(list) > 0 )
    33     {
    34         int* p = (int*)StaticList_Delete(list, 0);
    35         
    36         printf("%d
    ", *p);
    37     }
    38     
    39     printf("
    ");
    40     
    41     StaticList_Insert(list, &x, 0);
    42     StaticList_Insert(list, &y, 0);
    43     StaticList_Insert(list, &z, 0);
    44     
    45     printf("Capacity: %d Length: %d
    ", StaticList_Capacity(list), StaticList_Length(list));
    46     
    47     for(index=0; index<StaticList_Length(list); index++)
    48     {
    49         int* p = (int*)StaticList_Get(list, index);
    50         
    51         printf("%d
    ", *p);
    52     }
    53     
    54     StaticList_Destroy(list);
    55     
    56     return 0;
    57 }
  • 相关阅读:
    无法添加数据库未能加载文件或程序集“Microsoft.SqlServer.Management.Sdk.Sfc, Version=10.0.0.0, Culture=neutral,PublicKeyToken=89845dcd8080c
    转载:自己制作Visual Studio项目模板(以原有项目为模版) VS—项目模板丢失的解决方案
    设计一个高效的缓存管理服务 C#
    Visual Studio 30个快捷键2009年05月22日
    Everything 中文绿色版
    Visual studio 打包
    远程桌面连接超出最大连接数的3种解决办法
    [Cache 学习] Cache.Insert 与 Cache.Add 区别
    三层架构之我见 —— 不同于您见过的三层架构。
    基于IIS发布你的WCF Service。
  • 原文地址:https://www.cnblogs.com/xiaowulang/p/10797989.html
Copyright © 2011-2022 走看看