1. 程式人生 > >【資料結構】靜態連結串列

【資料結構】靜態連結串列

資料結構靜態連結串列實現

前言

靜態連結串列,是一種巧妙的資料結構實現方式。

靜態連結串列:

        每個節點有一個資料域(data),用來存放有用的資料資訊;

        還有一個下標域(cur),用來指示下一個元素的下標位置。

我們都知道鏈式線性表的優勢在於插入和刪除元素,時間複雜度都是O(1),因為不需要像順序儲存結構的線性表那樣在插入和刪除時需要移動大量的元素。

而靜態連結串列的實現就彌補了這樣的不足,我們以下標的方式來代替鏈式結構中使用的的指標,從而達到減少時間複雜度的功能。

分析


實現靜態連結串列

下面是程式碼,實現了最基本的幾個函式,包括插入元素刪除元素

獲取和釋放備用連結串列空間。

讀者可以自行新增其他的操作函式。

//======================================================================    
//    
//        Copyright (C) 2014-2015 SCOTT        
//        All rights reserved    
//    
//        filename: StaticList.c  
//        description: a demo to display StaticList
//    
//        created by SCOTT at  02/10/2015
//        http://blog.csdn.net/scottly1  
//    
//======================================================================    

#include <stdio.h>
#include <stdlib.h>

#define TRUE		1
#define FALSE		0
#define MAX_LEN		100

typedef  int  Status;
typedef  int  ElemType;

typedef struct _tag_staticlist
{
	ElemType data;
	int cur;
}StaticList, List[MAX_LEN];


/* Init StaticList */
Status InitList(StaticList * list)
{
	int i = 0;

	for(i=0; i<MAX_LEN - 1; i++)
	{
		list[i].cur = i + 1;
		list[i].data = 0;    //此處初始化為0 是為了方便觀看 實際中ElemType不一定是int型
	}

	list[MAX_LEN-1].cur = 0;
	list[MAX_LEN-1].data = 0;

	return TRUE;
}

/* Display StaticList */
void DisplayList(StaticList * list)
{
	int i = 0;

	for(i=0; i<MAX_LEN; i++)
	{
		printf("%d.cur = %d, %d.data = %d\n", i, list[i].cur, i, list[i].data);
	}

	return ;
}

/* Malloc StaticList, Get Free Space */
int Malloc_SL(StaticList * list)
{
	int ret = 0;

	ret = list[0].cur;

	list[0].cur = list[ret].cur;  // 指向下一個節點的cur

	return ret;
}

/* Free StaticList, Free Space */
Status Free_SL(StaticList * list, int j)
{
	list[j].cur = list[0].cur;   // 儲存備用連結串列第一個節點下一個節點cur

	list[0].cur = j;             // j成為備用連結串列的首節點下標

	return TRUE;
}

/* Insert StaticList */
Status InsertList(StaticList * list, int pos, ElemType data)
{
	int i = 0;
	int j = 0;
	int k = MAX_LEN - 1;

	if(pos < 1 || NULL == list || pos >= MAX_LEN - 1)
		return FALSE;
		
	j = Malloc_SL(list);                    // Malloc cur
	list[j].data = data;			// Insert data
	for(i=1; i<pos; i++)
	{
		k = list[k].cur;
	}
		
	list[j].cur = list[k].cur;
	list[k].cur = j;

	return TRUE;
}


Status InsertList(StaticList * list, int pos, ElemType *ret)
{
	int i = 0;
	int j = 0;
	int k = MAX_LEN - 1;

	if(pos < 1 || NULL == list || pos >= MAX_LEN - 1)
		return FALSE;

	for(i=1; i<pos; i++)
	{
		k = list[k].cur;
	}

	j = list[k].cur;

	*ret = list[j].data;	

	Free_SL(list, j);

	return TRUE;
}


int main()
{
	List  L ;
	InitList(L);
	DisplayList(L);
	ElemType ret;

	printf("=============\n");
	InsertList(L, 1, 11);
	InsertList(L, 2, 22);
	InsertList(L, 3, 33);
	InsertList(L, 4, 44);
	InsertList(L, 5, 55);

	InsertList(L, 3, 66);
	DisplayList(L);

	printf("=============\n");
	InsertList(L, 1, &ret);
	DisplayList(L);
	printf("%d has been removed!\n", ret);

	return 0;
}

執行結果:

原創文章,轉載請著名出處:http://blog.csdn.net/scottly1/article/details/43669933

相關推薦

資料結構靜態連結串列

資料結構之靜態連結串列實現 前言 靜態連結串列,是一種巧妙的資料結構實現方式。 靜態連結串列:         每個節點有一個資料域(data),用來存放有用的資料資訊;         還有一個下標域(cur),用來指示下一個元素的下標位置。 我們都知道鏈式線性表的

資料結構環形連結串列

給定一個連結串列,判斷連結串列中是否有環。 思路分析: 判斷連結串列是否帶環,實際上歸屬於快慢指標問題,快指標先進環,慢指標後進環,然後快指標和慢指標最終會在環裡面相遇,如果不會相遇,則表示不是迴圈連結串列,也就是說到頭了,即不帶環。 具體程式碼如下: /**

資料結構雙向連結串列的實現

文章目錄 LinkList.h LinkLish.c LinkList.h #ifndef __LINKLIST_H__ #define __LINKLIST_H__ #include <stdio.h>

資料結構複雜連結串列的複製

複雜連結串列的結構體 typedef struct ComplexNode { int data; struct ComplexNode *next; struct ComplexNode *r

資料結構--1.連結串列的基本操作和雜湊表定義

C實現連結串列的基本操作 初始化 插入 刪除  雜湊表的定義  //連結串列的基本操作 初始化 插入 刪除 雜湊表的定義 #include<iostream> using namespace std; typedef struct Node { int

資料結構迴圈連結串列和非迴圈單鏈表的區別

注意:這裡的迴圈連結串列是以尾指標為起始。非迴圈單鏈表判斷結束的標誌為指標為空。而迴圈連結串列判斷結束的標誌是指標不是頭節點。在插入操作中,非迴圈單鏈表判斷迴圈結束是指標為空。若迴圈結束後,發現指標變為空,說明要求插入的位置不合理:位置大於Length+1。bool ins

資料結構跳躍連結串列(Skip list)

普通的連結串列存在一個嚴重的缺陷: 需要順序掃描才能找到所需要的元素。而且查詢從連結串列的開頭開始,只有找到了所需要的元素,或者直到連結串列的末尾都沒有找到這個元素時才會停下來。將量表進行排序可以加速查詢的過程,但是仍然需要順序查詢。因此,很容易想到,連結串列最好可以跳過某

資料結構連結串列實現多項式運算

一元多項式的運算包括加法減法和乘法,而多項式的加法和乘法都可以依靠多項式的加法來實現,所以本文僅僅講解如何用連結串列實現一元多項式的加法。 數學上的一元多項式的表示是p(x) = p0 + p1 * x + p2 * x^2 + p3 * x^3 + … +

C/C++資料結構雙向連結串列操作

目錄 標頭檔案定義 測試檔案 雙向連結串列操作 像雙向連結串列的求長,判空,遍歷,查詢,檢索,之類的操作都和單鏈表一樣的。不過我還是在了文中。 標頭檔案定義 #ifndef _DOUBLELINKLIST_H_ #def

php實現資料結構單向連結串列

什麼是單向連結串列 連結串列是以鏈式儲存資料的結構,其不需要連續的儲存空間,連結串列中的資料以節點來表示,每個節點由元素(儲存資料)和指標(指向後繼節點)組成。 單向連結串列(也叫單鏈表)是連結串列中最簡單的一種形式,每個節點只包含一個元素和一個指標。它有一個表頭,並且除了最後一個節點外,所有節點都有其後

資料結構靜態順序表各種功能實現(C語言)

順序表的儲存方式 定義一個順序表 #define MAX_SIZE (100) typedef int DataType; typedef struct SeqList { DataType data[MAX_SIZE]; int siz

資料結構靜態、動態順序表

靜態順序表 順序表的初始化和銷燬 列印順序表 查詢

資料結構_靜態連結串列_哈夫曼

1、建立一棵二叉連結串列樹,分別輸出此先根,中根,後根遍歷序列(例如:輸入:ABDH##I##E##CF#J##G##) 2、將練習題程式設計,實現哈夫曼樹的構建和哈夫曼編碼設計(例如:輸入n=5,權值=0.12 0.40 0.15 0.08 0.25) #include&

線性表靜態連結串列

StaticLinkedList.h #ifndef STATICLINKEDLIST_H #define STATICLINKEDLIST_H #include<iostream> const int max_size = 1000; //list nod

資料結構03--靜態連結串列

靜態連結串列 靜態連結串列: 對靜態連結串列進行初始化相當於初始化陣列: Status InitList(StaticLinkList space) { int i; for( i=0; i<MAXSIZE-1;i++) space[i].cur = i+1; s

C語言資料結構靜態連結串列實現(A-B)U(B-A)

時間複雜度O(3n)不是很難,直接貼程式碼:StaticLinkList.h#ifndef _STATIC_LINK_LIST_H_ #define _STATIC_LINK_LIST_H_ #define MAXSIZE 100 typedef enum {ERROR,OK

C++資料結構靜態連結串列

宣告:本文所有的字詞如指標,指向,地址都不是真正意義上的指標與地址,只是為了方便理解與說明。結點為結構體,與單鏈表相差無幾,都有資料域和指標域,只不過單鏈表中的next是真的指標,指向記憶體地址,而靜態連結串列中的next則指向下一個元素在陣列中的下標struct Node{

資料結構線性表的鏈式儲存(四)靜態連結串列

靜態連結串列的初始化插入刪除操作 程式碼收穫 靜態連結串列有一個備用連結串列和資料兩條鏈在一個數組空間裡。 比較特別的是需要對是否空鏈進行討論,只有在空鏈時,-1遊標對應的索引的資料是無效資料。 用scanf記得後面要把回車吃掉。 插入和刪除需要考慮備用連結串

資料結構多項式連結串列實現相加

#include<bits/stdc++.h> using namespace std; const int inf = 0x3f3f3f3f; const int maxn = 1006; struct node { double coef; int exp; struct n

資料結構合併兩個有序連結串列

#include<stdio.h> #include<string.h> #include<stdlib.h> const int maxn = 1e5 + 5; struct node { int num; struct node *next; }; s