1. 程式人生 > >靜態連結串列的實現與操作(C語言實現)

靜態連結串列的實現與操作(C語言實現)

我們知道要實現單鏈表,必須要有指標,那麼像Java這樣沒有指標的的語言就略顯蛋疼了。

沒關係,我們有靜態連結串列,其本質就是用採用陣列的方式實現單鏈表的功能。

標頭檔案:

#ifndef _StaticLinkList_H_
#define _StaticLinkList_H_

typedef void StaticLinkList;
typedef void StaticLinkListNode;   


StaticLinkList * StaticLinkList_Create(int capacity);

void StaticLinkList_DesTroy(StaticLinkList * list);

void StaticLinkList_Clear(StaticLinkList* list);

int StaticLinkList_Length(StaticLinkList* list);

int StaticLinkList_Capacity(StaticLinkList* list);

int StaticLinkList_Insert(StaticLinkList* list, StaticLinkListNode* node, int pos);

StaticLinkListNode* StaticLinkList_Get(StaticLinkList* list, int pos);

StaticLinkListNode* StaticLinkList_Delete(StaticLinkList* list, int pos);

#endif 
原始檔:
// 靜態連結串列.cpp : 定義控制檯應用程式的入口點。
//
//靜態連結串列的出現主要是為了彌補有些程式語言沒有指標而不能建立單鏈表的缺憾

#include "stdafx.h"
#include <stdlib.h>
#include <malloc.h>
#include "StaticLinkList.h"
const int AVAILABLE = -1;

typedef struct    //header.data  用作存放陣列的長度
{
	int data;   //資料域
	int next;   //下一個元素的下標
}TStaticLinkListNode;

typedef struct
{
	int capacity;   //連結串列的總長度
	TStaticLinkListNode header;  //頭結點,data為陣列的長度,next為第一個元素的下標
	TStaticLinkListNode node[];  //陣列,存放資料
}TStaticLinkList;

int _tmain(int argc, _TCHAR* argv[])
{
	StaticLinkList* list = StaticLinkList_Create(10);   //建立一個總長度為10的靜態連結串列
    
    int index = 0;    
    int i = 0;
    int j = 1;
    int k = 2;
    int x = 3;
    int y = 4;
    int z = 5;
    
    StaticLinkList_Insert(list, (StaticLinkListNode*)&i, 0);
    StaticLinkList_Insert(list, (StaticLinkListNode*)&j, 0);
    StaticLinkList_Insert(list, (StaticLinkListNode*)&k, 0);
    
	for(index=0; index<StaticLinkList_Length(list); index++)
    {
		int* p = (int*)StaticLinkList_Get(list, index);
        
        printf("插入了: %d\n", *p);
    }
    
    printf("\n");
    
    while( StaticLinkList_Length(list) > 0 )
    {
		int* p = (int*)StaticLinkList_Delete(list, 0);
        
        printf("刪除了: %d\n", *p);
    }
    
    printf("\n");
    printf("重新插入: \n\n");
	StaticLinkList_Insert(list, (StaticLinkListNode*)&x, 0);
    StaticLinkList_Insert(list, (StaticLinkListNode*)&y, 0);
    StaticLinkList_Insert(list, (StaticLinkListNode*)&z, 0);
    
	//列印總長度和長度
	printf("Capacity: %d Length: %d\n", StaticLinkList_Capacity(list), StaticLinkList_Length(list));
    
    for(index=0; index<StaticLinkList_Length(list); index++)
    {
        int* p = (int*)StaticLinkList_Get(list, index);
        
        printf("插入了: %d\n", *p);
    }
    
	StaticLinkList_DesTroy(list);//銷燬
    
	
	system("pause");
	return 0;
}

//建立
StaticLinkList * StaticLinkList_Create(int capacity)
{
	TStaticLinkList * list = NULL;
	if(capacity > 0)
	{
		list = (TStaticLinkList*)malloc(sizeof(TStaticLinkList) + sizeof(TStaticLinkListNode)*(capacity + 1));
	}
	if(NULL != list)
	{
		list->header.data = 0;
		list->header.next = 0;
		list->capacity = capacity;
	}

	for (int i = 1; i<=list->capacity; i++)
	{
		list->node[i].next = AVAILABLE;
	}

	return list;
}
//銷燬
void StaticLinkList_DesTroy(StaticLinkList * list)
{
	free(list);
}

//清空
void StaticLinkList_Clear(StaticLinkList* list)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	if(sList != NULL)
	{
		sList->capacity = 0;
		sList->header.data = 0;
		sList->header.next = 0;
	}
}

//獲得長度
int StaticLinkList_Length(StaticLinkList* list)
{	
	TStaticLinkList* sList = (TStaticLinkList*)list;
	int len = -1;
	if(NULL != sList)
	{
		len = sList->header.data;
	}
	return len;
}


//獲得總長度
int StaticLinkList_Capacity(StaticLinkList* list)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	int capacity = -1;
	if(NULL != sList)
	{
		capacity = sList->capacity;
	}
	return capacity;
}

//插入
int StaticLinkList_Insert(StaticLinkList* list, StaticLinkListNode* node, int pos)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	TStaticLinkListNode* sNode = (TStaticLinkListNode*)node;
	int current = 0;
	int index = 0;
	int i = 0;
	int bol = 0;
	for( i=1; i<=sList->capacity; i++)
	{
		if(sList->node[i].next == AVAILABLE)
		{
			index = i;
			break;
		}
	}
	if((NULL != sList) && (NULL != sNode) && (pos >= 0) && (sList->header.data+1 <= sList->capacity))
	{
		sList->node[index].data = (unsigned int)node;
		sList->node[0] = sList->header;

		for( i=0; i<pos && sList->node[i].next != 0; 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];
		 bol = 1;
	}
	return bol;
}

//獲取結點
StaticLinkListNode* StaticLinkList_Get(StaticLinkList* list, int pos)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	int i = 0;
	int obj = 0;
	int current = 0;
	if((NULL != sList) && (pos>=0) && (pos < sList->header.data))
	{
		sList->node[0] = sList->header;
		for( i=0; i<pos; i++)
		{
			current = sList->node[current].next;
		}
		obj = sList->node[current].next;
	}
	return (StaticLinkListNode*)sList->node[obj].data;
}

//刪除
StaticLinkListNode* StaticLinkList_Delete(StaticLinkList* list, int pos)
{
	TStaticLinkList* sList = (TStaticLinkList*)list;
	int  i = 0;
	int current = 0;
	int obj = 0;
	if((NULL != sList) && (pos >= 0) && (pos < sList->header.data))
	{
		sList->node[0] = sList->header;
		for( i=0; i<pos; i++)
		{
			current = sList->node[current].next;
		}
		obj =  sList->node[current].next;
		sList->node[current].next = sList->node[obj].next;
		--(sList->node[0].data);
		sList->header = sList->node[0];
		sList->node[obj].next = AVAILABLE;
		
	}
	return (StaticLinkListNode*)sList->node[obj].data;
}

執行結果:
插入了: 2
插入了: 1
插入了: 0

刪除了: 2
刪除了: 1
刪除了: 0

重新插入:

Capacity: 10 Length: 3
插入了: 5
插入了: 4
插入了: 3
請按任意鍵繼續. . .

小結:

1,靜態連結串列其實是單鏈表的另一種實現方式

2,靜態連結串列的實現“媒介”不是指標而是陣列

3,靜態連結串列主要用於不支援指標的程式設計語言中

4,靜態連結串列的實現是一種記憶體管理的簡易方法

如果錯誤,望不吝指出。