線性表之基於連結串列的實現
歡迎關注,大家共同學習!
上一篇介紹了線性表的順序儲存結構和基於陣列的實現,這篇介紹線性表的鏈式儲存結構。
鏈式儲存:用一組任意的儲存單元儲存線性表中的元素;
特點:
(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實現]的內容。並且貼上的說明圖也是來自於這篇帖子,再次特做宣告。 什麼是靜態連結串列 用全域性資料實現的連結串列叫做靜