1. 程式人生 > >資料結構--雙向連結串列

資料結構--雙向連結串列

1.之前接觸到的連結串列都只有一個指標,指向直接後繼,整個連結串列只能單方向從表頭訪問到表尾,這種結構的連結串列統稱為 “單向連結串列”或“單鏈表”。如果演算法中需要頻繁地找某結點的前趨結點,單鏈表的解決方式是遍歷整個連結串列,增加演算法的時間複雜度,影響整體效率。為了快速便捷地解決這類問題,在單向連結串列的基礎上,給各個結點額外配備一個指標變數,用於指向每個結點的直接前趨元素。這樣的連結串列被稱為“雙向連結串列”或者“雙鏈表”

2.

並且實現(1,2,3)中插入一個結點 4,變成(1,4,2,3)操作:

程式碼:

#include<stdio.h>
#include<stdlib.h>
//結構體定義
typedef struct line {
	struct  line *prior;//指向直接前驅
	int data;
	struct line *next;//指向直接後驅
}line;
//結構體初始化
line * initLine(line *head) {
	head = (line *)malloc(sizeof(line));//建立首元結點
	head->prior = NULL;
	head->next = NULL;
	head->data = 1;
	line *list = head;
	for (int i = 2; i <= 3; i++) {
		//建立並初始化一個新節點
		line *body = (line *)malloc(sizeof(line));
		body->prior = NULL;
		body->next = NULL;
		body->data = i;

		list->next = body;//直接前驅結點的next指標指向新節點
		body->prior = list;//新節點指向直接前驅結點
		list = list->next; 

	}
	return head;
}
//在雙向連結串列中插入資料4,,變成(1,4,2,3)
line *insertLine(line *head, int data, int add) {
	//新建資料域為data的結點
	line *temp = (line *)malloc(sizeof(line));
	temp->prior = NULL;
	temp->next = NULL;
	temp->data = data;
	//插入連結串列頭,要特殊考慮
	if (add == 1) {
		temp->next = head;
		head->prior = temp;
		head = temp;
	}
	else
	{
		line *body = head;
		//找到要插入位置的前一個結點
		for (int i = 1; i < add - 1; i++) {
			body = body->next;
		}
		//判斷條件為真,說明插入位置為連結串列尾
		if (body->next == NULL) {
			body->next = temp;
			temp->prior = body;

		}
		else
		{
			body->next->prior = temp;
			temp->next = body->next;
			body->next = temp;
			temp->prior = body;
		}
	}
	return head;
}
//實現
void  display(line *head) {
    line * temp=head;
    while (temp) {
        if (temp->next==NULL) {
            printf("%d\n",temp->data);
        }else{
            printf("%d->",temp->data);
        }
        temp=temp->next;
    }
}
int main() {
	line *head = NULL;
	head = initLine(head);

	head = insertLine(head, 4, 2);
	display(head);
	return 0;


}

相關推薦

java資料結構——雙向連結串列

連結串列是非常常見的一類線性結構的資料結構,每個節點包含有指標域和資料域,常見的包括單項列表、雙向列表、迴圈列表。這篇文章將詳細介紹雙向連結串列。 雙端連結串列不同於單向連結串列僅有一個指標域指向下一個節點,而是同時持有下一個和上一個指標域,分別指向下一個和上一個節點,如下: 本文

資料結構-雙向連結串列-插入排序練習題

/* 若線性表中各結點的查詢概率不等,則可用如下策略提高順序查詢的效率:若找到指定的結點,則將該結點的fre域的值加1, 使得經常被查詢的結點位於表的前端。設雙向連結串列的儲存結構有四個域:pre,data,next和fre,data域為字元型,fre域為整形。 設計滿足該功能的

資料結構-雙向連結串列

單鏈表的結點中只有一個指示直接後繼的指標域,由此,從某個結點出發只能順指標往後尋查其他結點。若要尋查結點的直接前驅,則需從表頭指標出發。為克服單鏈表這種單向性的缺點,可利用雙向連結串列。 在雙向連結串

資料結構--雙向連結串列

1.之前接觸到的連結串列都只有一個指標,指向直接後繼,整個連結串列只能單方向從表頭訪問到表尾,這種結構的連結串列統稱為 “單向連結串列”或“單鏈表”。如果演算法中需要頻繁地找某結點的前趨結點,單鏈表的解決方式是遍歷整個連結串列,增加演算法的時間複雜度,影響整體效率。為了快速便

C語言資料結構----雙向連結串列

概括:主要說明雙向連結串列的基本概念和具體操作以及原始碼。 一、基本概念 1.有了單鏈表以後我們可以把記憶體中小塊的空間聯絡在一起,並且把每一個小塊都儲存上我們想要儲存的數值。但是單鏈表只有一個next,我們每一次都要從頭開始遍歷整個連結串列,這樣的話如果我們對單鏈表進行逆

python演算法與資料結構-雙向連結串列(40)

一、雙向連結串列的介紹   一種更復雜的連結串列是“雙向連結串列”或“雙面連結串列”。每個節點有兩個連結:一個指向前一個節點,當此節點為第一個節點時,指向空值;而另一個指向下一個節點,當此節點為最後一個節點時,指向空值。      上圖是雙向連結串列的結構

資料結構-雙向連結串列(Python實現)

資料結構在程式設計世界中一直是非常重要的一環,不管是開發還是演算法,哪怕是單純為了面試,資料結構都是必修課,今天我們介紹連結串列中的一種——雙向連結串列的程式碼實現。 好了,話不多說直接上程式碼。 雙向連結串列 首先,我們定義一個節點類:Node class Node: def __init__(se

【演算法與資料結構連結串列

1.如何分別用連結串列和陣列實現LRU緩衝淘汰策略? 1)什麼是快取? 快取是一種提高資料讀取效能的技術,在硬體設計、軟體開發中都有著非廣泛的應用,比如常見的CPU快取、資料庫快取、瀏覽器快取等等。 2)為什麼使用快取?即快取的特點 快取的大小是有限的,當快取被用滿時,哪些資料應該被清理出去,哪

玩轉資料結構——第三章:最基礎的動態資料結構連結串列

內容概括: 3-1.什麼是連結串列 3-2.在連結串列中新增元素 3-3.使用連結串列的虛擬頭結點 3-4.連結串列的遍歷,查詢和修改 3-5.從連結串列中刪除元素 3-6.使用連結串列實現棧 3-7.帶有尾指標的連結串列:使用連結串列實現佇列

資料結構——反轉連結串列的演算法實現

記錄一下連結串列的操作 這是曾經一道面試題 連結串列的考察更側重於程式碼的書寫和思路的形成。雖然說,連結串列的結構簡單,但是涉及到指標的操作,容易引申出一些挑戰性的考題,其中也牽涉到諸多小的細節的考慮,更能看出程式碼書寫的能力和功底。   廢話不多說上圖分析加程式碼

資料結構連結串列系列):連結串列建立,連結串列刪除特定節點,連結串列氣泡排序,連結串列快速排序

一、連結串列的理解: 1,各個節點間地址存放可以不連續,雖說是表,但是指標存在是為了找到其他的節點,如果連續了,都沒必要用連結串列了。 2,各節點依賴上一節點,要找到某一個節點必須找到他的上一個節點,所以要訪問連結串列,必須要知道頭指標,然後從頭指標訪問開始。 3,各節點間原來是獨立的,本

最基礎的動態資料結構連結串列

什麼是連結串列 連結串列是一種線性結構,也是最基礎的動態資料結構。我們在實現動態陣列、棧以及佇列時,底層都是依託的靜態陣列,靠resize來解決固定容量的問題,而連結串列是真正的動態資料結構。學習連結串列這種資料結構,能夠更深入的理解引用(或者指標)以及遞迴。其中連結串列分為單鏈連結串列和雙鏈連結串列,本文

資料結構連結串列C語言實現以及使用場景分析

連結串列是資料結構中比較基礎也是比較重要的型別之一,那麼有了陣列,為什麼我們還需要連結串列呢!或者說設計連結串列這種資料結構的初衷在哪裡? 這是因為,在我們使用陣列的時候,需要預先設定目標群體的個數,也即陣列容量的大小,然而實時情況下我們目標的個數我們是不確定的,因此我們總是要把陣列的容量設定的

java資料結構——單向連結串列

連結串列是非常常見的一類線性結構的資料結構,每個節點包含有指標域和資料域,常見的包括單項列表、雙向列表、迴圈列表。這篇文章將詳細介紹單向連結串列。 單向連結串列每個節點包含當前節點的資料域和一個指向下一個節點的指標域,如下: 本文將介紹連結串列的尾節點插入、頭結點插入、指定位置插入

資料結構連結串列操作(c++實現)

1、單向連結串列(頭結點不含資料,不佔長度),C++實現: #include <iostream> #include <stack> using namespace std; /*****定義節點****/ typedef struct node{ int va

C語言資料結構——雙迴圈連結串列的插入操作順序

雙向連結串列與單鏈表的插入操作的區別 雙向連結串列因為存在前驅指標和後繼指標所以需要修改的指標多於單鏈表,但指標改動的順序同樣重要 單鏈表的插入 eg:在節點p的後面插入指標s s->next=p->next;//首先要使要插入的指標指向p->next p->next=s

資料結構 - 基於連結串列的佇列

基於連結串列的佇列   當我們基於連結串列實現佇列時,需要從一端加元素,另一端取出元素,就需要引入一個新的變數tail指向連結串列的尾部,此時,向尾部進行新增操作時間複雜度會變為O(1),然而刪除操作還是需要從head向後遍歷,所以此時選擇連結串列尾為隊尾,連結串列頭為隊首。      基於連結串列的實

資料結構-完整連結串列&順序表

#include<iostream.h> #define increment 10 class sqlist{ private: int *elem; int listsize; int length; public: sqlist(int n);

c++資料結構連結串列詳情1(順序連結串列)

長大是人必經的潰爛        ---大衛塞林格 程式碼是年輕人的新生!!!!!! 程式 = 資料結構  + 演算法   --Niklaus EmilWirth 這篇部落格在參考一些書籍和教學視訊的基礎上整理而來,中間夾雜了一些自己

javaScript資料結構 04 連結串列

連結串列 連結串列儲存有序的元素集合。 01 就寫一個單向連結串列吧 ;(function (window) { function Node(data) { this.data = data; this.next = null; } funct