數據結構之靜態鏈表

學習數據結構已經很久了,一直沒有用上,最近時間有點空閒,所以翻出來炒一炒。子曰:溫故而知新。當初學習數據結構的時候,買的是國嵌唐老師的視頻,所以這些代碼很唐老師寫的幾乎一模一樣,若轉載請註明出自國嵌唐老師數據結構教程。

首先來看第三個例子,靜態鏈表:

頭文件

#ifndef _STATICLIST_H_
#define _STATICLIST_H_

typedef void StaticList;
typedef void StaticListNode;

StaticList* StaticList_Create(int capacity);

void StaticList_Destroy(StaticList* list);

int 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

我個人有點小小的強迫症,所以代碼進來要求簡潔,所以沒有註釋,有什麼不明白的可以留言。

實現文件

#include "StaticList.h"
#include <malloc.h>

#define AVAILABLE -1

typedef struct tag_StaticListNode
{
    unsigned int data;
    int next;
}TStaticListNode;

typedef struct tag_StaticList
{
    int capacity;
    TStaticListNode header;
    TStaticListNode node[];
}TStaticList;

StaticList* StaticList_Create(int capacity)
{
    TStaticList* ret = NULL;
    int i = 0;
    
    if (capacity >= 0)
    {
        ret = (TStaticList*)malloc(sizeof(TStaticList) + sizeof(TStaticListNode) * (capacity + 1));
        
		if (ret)
        {
  		    ret->capacity = capacity;
  		    ret->header.next = 0;
  		    ret->header.data = 0;
  		    
  		    for (i = 1; i <= capacity; i++)
  		    {
 			 	ret->node[i].next = AVAILABLE;
  			}
  		}
    }
    
    return ret;
}

void StaticList_Destroy(StaticList* list)
{
 	 free(list);
}

int StaticList_Clear(StaticList* list)
{
	TStaticList* sList = (TStaticList*)list;
	int ret = (sList != NULL);
	int i = 0;
	
	if (ret)
	{
	    sList->header.data = 0;
	    sList->header.next = 0;
	    for (i = 0; i < sList->capacity; i++)
	    {
	     	sList->node[i].next = AVAILABLE;
		}
 	}
 	
 	return ret;
}

int StaticList_Length(StaticList* list)
{
 	TStaticList* sList = (TStaticList*)list;
 	int ret = -1;
 	
 	if (sList != NULL)
	{
 	    ret = sList->header.data;
	}
 
 	return ret;
}

int StaticList_Capacity(StaticList* list)
{
 	TStaticList* sList = (TStaticList*)list;
 	int ret = -1;
 	
 	if (sList != NULL)
	{
 	    ret = sList->capacity;
	}
 
 	return ret;
}

int StaticList_Insert(StaticList* list, StaticListNode* node, int pos)
{
 	TStaticList* sList = (TStaticList*)list;
 	int ret = (sList != NULL) && (node != NULL);
 	ret = ret && (pos >= 0) && (sList->header.data + 1 <= sList->capacity);
 	int i = 0;
 	int index = 0;
 	int current = 0;
 	
 	if (ret)
 	{
		for (i = 1; i <= sList->capacity; i++)
		{
		 	if (sList->node[i].next == AVAILABLE)
		 	{
			   index = i;
			   break;
		    }
 		}
 		
 		sList->node[0] = sList->header;
 		
 		sList->node[index].data = (unsigned int)node;
 		
 		for (i = 0; (i < pos) && (sList->node[i].next != AVAILABLE); i++)
 		{
		 	current = sList->node[current].next;
        }
        
        sList->node[index].next = sList->node[current].next;
        sList->node[current].next = index;
 		
 		sList->node[0].data++;
 		
 		sList->header = sList->node[0];
	}
 
 	return ret;	
}

StaticListNode* StaticList_Get(StaticList* list, int pos)
{
    TStaticList* sList = (TStaticList*)list;
 	StaticListNode* ret = NULL;
 	int i = 0;
 	int index = 0;
 	int current = 0;
 	
 	if ((sList != NULL) && (pos >= 0) && (pos < sList->header.data))
 	{
        sList->node[0] = sList->header;
        
	    for (i = 0; i < pos; i++)
	    {
		 	current = sList->node[current].next;
 		}
 		
 		index = sList->node[current].next;
 		
  	    ret = (StaticListNode*)(sList->node[index].data);
	}
	
 	return ret;
}

StaticListNode* StaticList_Delete(StaticList* list, int pos)
{
    TStaticList* sList = (TStaticList*)list;
 	StaticListNode* ret = NULL;
 	int i = 0;
 	int index = 0;
 	int current = 0;
 	
 	if ((sList != NULL) && (pos >= 0) && (pos < sList->header.data))
 	{
	   	sList->node[0] = sList->header;
	   		   
	    for (i = 0; i < pos; i++)
	    {
		 	current = sList->node[current].next;
 		}
 		
 		index = sList->node[current].next;
  	    
  	    sList->node[current].next = sList->node[index].next;
  	    
  	    sList->node[0].data--;
  	    
  	    sList->node[index].next = AVAILABLE;
  	    
  	    sList->header = sList->node[0];
  	    
  	    ret = (StaticListNode*)(sList->node[index].data);
	}
	
 	return ret;
}

測試文件

<pre name="code" class="cpp">#include <stdio.h>
#include <stdlib.h>
#include "StaticList.h"

int main(int argc, char *argv[])
{
 	StaticList* list = StaticList_Create(10);
 	
 	int a = 1;
 	int b = 2;
 	int c = 3;
 	int d = 4;
 	int e = 5;
 	
 	int i = 0;
 	
 	StaticList_Insert(list, &a, 0);
 	StaticList_Insert(list, &b, 0);
 	StaticList_Insert(list, &c, 0);
 	StaticList_Insert(list, &d, 0);
 	StaticList_Insert(list, &e, 0);

 	printf("capacity = %d\n", StaticList_Capacity(list));
 	
 	for (i = 0; i < StaticList_Length(list); i++)
 	{
	 	int* p = (int*)StaticList_Get(list, i);
	 	printf("%d\n", *p);
  	}
  	
  	printf("length = %d\n", StaticList_Length(list));
  	
  	StaticList_Clear(list);
  	
  	StaticList_Insert(list, &a, StaticList_Length(list));
 	StaticList_Insert(list, &b, StaticList_Length(list));
 	StaticList_Insert(list, &c, StaticList_Length(list));
 	StaticList_Insert(list, &d, StaticList_Length(list));
 	StaticList_Insert(list, &e, StaticList_Length(list));
 	
 	for (i = 0; i < StaticList_Length(list); i++)
 	{
	 	int* p = (int*)StaticList_Get(list, i);
	 	printf("%d\n", *p);
  	}
  	
  	printf("length = %d\n", StaticList_Length(list));
  	
  	while (StaticList_Length(list) > 0)
  	{
	 	int* p = (int*)StaticList_Delete(list, 0);
	 	printf("%d\n", *p);  
    }
    
    printf("length = %d\n", StaticList_Length(list));

    StaticList_Destroy(list);
  
    system("PAUSE");	
    return 0;
}


靜態鏈表用到了C語言中的柔性數組,不瞭解的可以去百度下。還有就是靜態鏈表的主要用處是在那些不適合用指針的場合,這樣可以避免指針操作的同時實現鏈表。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章