1. 程式人生 > >線性表之基於連結串列的實現

線性表之基於連結串列的實現

歡迎關注,大家共同學習!

上一篇介紹了線性表的順序儲存結構和基於陣列的實現,這篇介紹線性表的鏈式儲存結構。

鏈式儲存:用一組任意的儲存單元儲存線性表中的元素;

特點:

(1)儲存單元可以是連續的,也可以是零散的;

(2)連結串列中結點的物理順序和邏輯順序不一定相同。

由於儲存單元不一定是連續的,為了正確的表示結點之間的邏輯關係,每個結點除了儲存資料資訊外,還需要儲存結點的直接後繼結點的地址,我們稱之為鏈或指標。

1、結點的定義:

typedef struct Lnode
{
    ElemType data;
    struct Lnode *next;
}LNode;

2、初始化

int LinkList_Init(LNode *head)
{
    head->data=0;
    head->next=NULL;
    return OK;
}

3、表的插入操作

int LinkList_Insert(LNode *head,int i,ElemType e)
{
    int flag=0;
    LNode *p,*pre,*q;
    pre=head;
    p=head->next;
    flag++;
    while(flag<i)
    {
        pre=p;
        p=p->next;
        flag++;
    }
    q=(LNode *)malloc(sizeof(LNode));
    q->data=e;
    pre->next=q;
    q->next=p;
    return OK;
}

4、表的刪除操作

int LinkList_Delete(LNode *head,int i,ElemType *x)
{
    int flag=0;
    LNode *pre,*p;
    pre=head;
    p=head->next;
    flag++;
    while(flag<i)
    {
        pre=p;
        p=p->next;
        flag++;
    }
    *x=p->data;
    pre->next=p->next;
    return OK;
}

5、獲取表的長度

int LinkList_getLength(LNode *head)
{
    int counter=0;
    LNode *p;
    p=head;
    while(!p)
    {
        counter++;
        p=p->next;
    }
    return counter;
}

6、獲取表尾元素

int LinkList_getLastData(LNode *head)
{
    ElemType temp;
    LNode *p;
    p=head;
    while(p->next)
    {
        p=p->next;
    }
    temp=p->data;
    return temp;
}

7、列印元素

int LinkList_print(LNode *head)
{
    LNode *p;
    p=head->next;
    cout<<"列印結果:"<<endl;
    while(p)
    {
        cout<<p->data<<endl;
        p=p->next;
    }
    return OK;
}

關於鏈式儲存結構的線性表結構的定義和全部操作就是上述這些,最後給出全部測試程式碼:

#include <iostream>
#include<malloc.h>
#define OK 1
#define ERROR -1
typedef int ElemType;
using namespace std;
//
typedef struct Lnode
{
    ElemType data;
    struct Lnode *next;
}LNode;
//
int LinkList_Init(LNode *head)
{
    head->data=0;
    head->next=NULL;
    return OK;
}
//
int LinkList_getLength(LNode *head)
{
    int counter=0;
    LNode *p;
    p=head;
    while(!p)
    {
        counter++;
        p=p->next;
    }
    return counter;
}
//insert
int LinkList_Insert(LNode *head,int i,ElemType e)
{
    int flag=0;
    LNode *p,*pre,*q;
    pre=head;
    p=head->next;
    flag++;
    while(flag<i)
    {
        pre=p;
        p=p->next;
        flag++;
    }
    q=(LNode *)malloc(sizeof(LNode));
    q->data=e;
    pre->next=q;
    q->next=p;
    return OK;
}
//
int LinkList_Delete(LNode *head,int i,ElemType *x)
{
    int flag=0;
    LNode *pre,*p;
    pre=head;
    p=head->next;
    flag++;
    while(flag<i)
    {
        pre=p;
        p=p->next;
        flag++;
    }
    *x=p->data;
    pre->next=p->next;
    return OK;
}
//
int LinkList_getLastData(LNode *head)
{
    ElemType temp;
    LNode *p;
    p=head;
    while(p->next)
    {
        p=p->next;
    }
    temp=p->data;
    return temp;
}
int LinkList_print(LNode *head)
{
    LNode *p;
    p=head->next;
    cout<<"列印結果:"<<endl;
    while(p)
    {
        cout<<p->data<<endl;
        p=p->next;
    }
    return OK;
}
int main()
{
    LNode *head;
    ElemType x_delete;
    head=(LNode *)malloc(sizeof(LNode));
    LinkList_Init(head);
    for(int i=0;i<10;i++)
        LinkList_Insert(head,i+1,i);
    LinkList_print(head);
    LinkList_Delete(head,5,&x_delete);
    cout<<"刪除的元素:"<<x_delete<<endl;
    cout<<"獲得表尾元素:"<<LinkList_getLastData(head)<<endl;
    cout<<"列印操作後的元素:"<<endl;
    LinkList_print(head);
    return 0;
}


相關推薦

線性基於連結串列實現

歡迎關注,大家共同學習! 上一篇介紹了線性表的順序儲存結構和基於陣列的實現,這篇介紹線性表的鏈式儲存結構。 鏈式儲存:用一組任意的儲存單元儲存線性表中的元素; 特點: (1)儲存單元可以是連續的,也可以是零散的; (2)連結串列中結點的物理順序和邏輯順序不一定相同。 由於儲

資料結構與演算法(三)-線性靜態連結串列

前言:前面介紹的線性表的順序儲存結構和鏈式儲存結構中,都有對物件地引用或指向,也就是程式語言中有引用或者指標,那麼在沒有引用或指標的語言中,該怎麼實現這個的資料結構呢? 一、簡介   定義:用陣列代替指標或引用來描述單鏈表,即用陣列描述的連結串列叫做靜態連結串列,這種描述方法叫做遊標實現法;  

資料結構與演算法(五)-線性雙向連結串列與雙向迴圈連結串列

前言:前面介紹了迴圈連結串列,雖然迴圈連結串列可以解決單鏈表每次遍歷只能從頭結點開始,但是對於查詢某一節點的上一節點,還是頗為複雜繁瑣,所以可以在結點中加入前一個節點的引用,即雙向連結串列 一、簡介   雙向連結串列:在連結串列中,每一個節點都有對上一個節點和下一個節點的引用或指標,即從一個節點出發可以有

玩轉C線性和單向連結串列Linux雙向連結串列優化

  前言:   這次介紹基本資料結構的線性表和連結串列,並用C語言進行編寫;建議最開始學資料結構時,用C語言;像棧和佇列都可以用這兩種資料結構來實現。   一、線性表基本介紹     1 概念:                  線性表也就是關係戶中最簡單的一種關係,一對一。            

資料結構實現 6.4:優先佇列_基於連結串列實現(C++版)

資料結構實現 6.4:優先佇列_基於連結串列實現(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 入隊操作 2.2 出隊操作 2.3 查詢操作 2.4 其他操作 3. 演算法複雜度分析

資料結構實現 5.2:對映_基於連結串列實現(C++版)

資料結構實現 5.2:對映_基於連結串列實現(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.2 刪除操作 2.3 修改操作 2.4 查詢操作 2.5 其他操作 3. 演

資料結構實現 4.2:集合_基於連結串列實現(C++版)

資料結構實現 4.2:集合_基於連結串列實現(C++版) 1. 概念及基本框架 2. 基本操作程式實現 2.1 增加操作 2.2 刪除操作 2.3 查詢操作 2.4 其他操作 3. 演算法複雜度分析

【 C# 資料結構】(一) -------------------------- 泛型帶頭節點的單鏈,雙向連結串列實現

在程式設計領域,資料結構與演算法向來都是提升程式設計能力的重點。而一般常見的資料結構是連結串列,棧,佇列,樹等。事實上C#也已經封裝好了這些資料結構,在標頭檔案 System.Collections.Generic 中,直接建立並呼叫其成員方法就行。不過我們學習當然要知其然,亦知其所以然。 本文實現的是連結

【Java原始碼】基於連結串列實現的LinkedList

    眾所周知,LinkedList是基於連結串列實現的。 目錄 基本屬性 構造方法 刪除元素 其他方法 迭代器 總結    基本屬性 transient int size = 0; transient Node<E> f

線性】靜態連結串列

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

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

Python中的連結串列單向連結串列實現棧和佇列

Python中除了列表,還有連結串列這樣的基礎資料結構,之前我們都是介紹用列表實現棧、佇列這樣的資料結構的,接下來我們看一下用連結串列實現的棧和佇列。 既然列表已經可以實現棧和隊列了,那麼連結串列又有什麼存在的意義呢?當然是因為列表有一些明細的缺點: 記憶體的

基於 連結串列 實現通訊錄的功能

簡介 最近, 我編寫了一個程式,用於實現手機通訊錄的功能。 該程式基於 單向迴圈連結串列 , 實現了 新建聯絡人、(按編號、姓名、號碼)刪除聯絡人、(按編號、姓名、號碼)修改聯絡人、(按編號、姓名、號碼)查詢聯絡人、(按姓名、號碼排序)遍歷顯示聯絡人的功能,

JAVA基於陣列實現集合和基於連結串列實現集合

1.定義一個介面MyListpublic interface MyList { //增 void add(int num); //刪 boolean delete(int index2); //改 boolean update(int index2, int n

資料結構單鏈建立連結串列(尾插法)

接上一篇內容,這次使用尾插法來建立單鏈表: 1.同樣建立連結串列成員結構體: struct listnode { int value; listnode* next; }; 2.然後下面就是通過尾插法建立單鏈表的程式,這裡面稍稍要去理解

資料結構示例連結串列實現

以下是“使用連結串列實現棧”的簡單示例: 1. 用c語言實現的版本 #include<stdio.h> #include<stdlib.h> struct s_node { int data; struct s_node *next; };

資料結構 1 線性詳解 連結串列、 棧 、 佇列 結合JAVA 詳解

## 前言 其實在學習資料結構之前,我也是從來都沒了解過這門課,但是隨著工作的慢慢深入,之前學習的東西實在是不夠用,並且太皮毛了。太淺,只是懂得一些淺層的,我知道這個東西怎麼用,但是要優化、或者是解析,就不知道該咋弄了。比如JAVA 最有名的幾個容器: - List - Set - MAP - Queue

圖說線性-搞懂連結串列從這篇文章開始

上篇文章是資料結構的基礎部分,主要介紹了一些注意事項。   今天開始線性表部分的梳理,線性表主要分為了基礎概念和基本操作兩大部分,由於某些過程或概念比較抽象,我添加了部分圖示,希望能夠把這些抽象的東西直觀的表達出來。   基本操作模組重點主要在單鏈表和順序表兩部分,本文著重梳理了線性表插入

單鏈環形連結串列

    不論在面試或者刷題過程中,很大概率都會遇到環形連結串列這種型別的題目,例如 leetcode 141. 環形連結串列 以及 leetcode 142. 環形連結串列 II 等,本文主要介紹通過快慢指標法來解決此類題型,以供大家參考。 環形連結串列 &n

線性連結串列實現(二)-靜態連結串列實現

靜態連結串列基本概念 這一部分的內容主要參照了這篇帖子[靜態連結串列 C實現]的內容。並且貼上的說明圖也是來自於這篇帖子,再次特做宣告。 什麼是靜態連結串列 用全域性資料實現的連結串列叫做靜