1. 程式人生 > >【資料結構】順序表、單鏈表、迴圈連結串列的插入與刪除

【資料結構】順序表、單鏈表、迴圈連結串列的插入與刪除

寫在前面的

       在複習資料結構的過程中對於連結串列的操作總是容易忘記,時不時的就不知道具體的該怎麼操作了,所以把這幾個比較細節的地方總結一下,讓自己印象加深一下,給之後的學習做個參考。

        接下來主要總結一下單鏈表迴圈連結串列的插入與刪除的方法和具體的程式碼。導圖如下
這裡寫圖片描述

順序表

插入

  • 步驟:首先將節點依次向後移動一個元素的位置,這樣空出第i個數據元素的位置;然後將資料x插入這個位置,最後表長加1.

  • 演算法如下:

void InsertSeqlist(SeqList L,DataType x,int
i) { //將元素x插入到順序表L的第i個數據元素之前 if(L.length==Maxsize) exit("該連結串列已滿!"); if(i<1 || i>L.length + 1) exit("插入非法位置!"); for(j=L.length,j>=i;j--) { L.data[j]=L.data[j-1]; //依次後移 } L.data[i-1]=x; //將x插入到下標為i-1的位置 L.length++; //表長加1 }
  • 圖例解釋:

    這裡寫圖片描述

    元素挪動位置之後:

    這裡寫圖片描述

    最後插入:

    這裡寫圖片描述

刪除

  • 步驟:節點依次向左移動一個元素位置;表長度減一。與插入不同的是,此處無需考慮溢位,只需判斷引數i是否合法即可。

  • 演算法如下:

void DeleteSeqList(SeqList L, int i)
{
    //刪除線性表L中第i個結點
    if(i<1 || i>L.length)  exit("非法位置!");

    for(j=i; j<L.length; j++)  //第i個元素的下角標為i-1
    {
        L.data[j-1]=L.data[j];  //依次左移
    }
    L.length--;
}

定位

  • 演算法描述:i從0開始,作為掃描順序表的下表。如果表中有一個節點的值等於x,或i等於L.length,則終止迴圈。如果迴圈終止於i=L.length,則未找到x,返回0,否則返回x的位置。

  • 演算法如下:

int LocateSeqList(SeqList L, DataType x)
{
    int i=0;

    while((i<L.length) && (L.data[i]!=x))  //在順序表中查詢值為x的節點
    {
        i++;
    }

    if(i<L.length) return i+1;

    else return 0;
}

單鏈表

插入

  • 步驟:將給定的x的元素插入到連結串列的第i個節點之前。首先找到連結串列的第i-1個節點q,然後,生成一個值為x的新節點p,p的指標指向q的直接後繼點,q的指標指向p,這樣就完成了單鏈表的插入運算。

  • 導圖如下:

這裡寫圖片描述

  • 演算法如下:
void InsertLinklist(LinkList head, DataType x, int i)
{
    Node *p,*q;
    if(i==1) q=head;
    else q=GetLinklist(head,i-1);  //找到第i-1 個數據元素節點

    if(q==NULL)  exit("找不到插入的位置!");  //第i-1個節點不存在
    else
    {
        p=malloc(sizeof(Node)); p->data=x;  //生成新節點
        p->next=q->next;  //新街點鏈指向*q的後繼節點
        q->next=p;  //修改*q的鏈域
    }
}

"連結操作p->next=q->next 和 q->next=p 兩條語句的執行順序不能顛倒,否則結點*q的鏈域值(指向原表第i個結點的指標)將丟失"

刪除

  • 步驟:給定一個值i,將連結串列中第i個結點從連結串列中移除,並修改相關結點的指標,以維持剩餘結點的連結關係。

  • 導圖如下:
    這裡寫圖片描述

  • 演算法如下:

void DeleteLinklist(LinkList head, int i)
{
    Node *q;
    if (i==1) q=head;
    else q=GetLinklist(head, i-1);  //先找待刪除節點的直接前驅

    if(q!=NULL && q->next!=NULL)  //若直接前驅存在切待刪除結點存在
    {
        p=q->next;  //p指向待刪除結點
        q->next=p->next;  //移除待刪除結點
        free(p);  //釋放已移除的結點p的空間
    }
    else exit("找不到要刪除的結點!")
}

雙向迴圈連結串列

刪除

  • 由於雙向連結串列存在指標prior以及next所以操作起來相對於其他形式的表複雜一些,基本的語法如下:
p->prior->next=p->next;  //p前驅結點的後鏈指向p的後繼結點

p->next->prior=p->prior;  //p後繼節點的前鏈指向p的前驅結點

free(p);  //釋放*p的空間

"前兩行的語句可以顛倒"

導圖如下:
這裡寫圖片描述

插入

  • 基本語法如下:
t->prior=p;
t->next=p->next;
p->next->prior=t;
p->next=t;
  • 導圖如下:
    這裡寫圖片描述

總結

  • 通過對資料結構中連結串列操作的總結,可以非常明顯的看出在具體的交換中表中的指標究竟是怎樣“運動”的。而且對於指標運動的順序一定要明確,否則整個連結串列就非常容易丟失,細節決定成敗!

相關推薦

課程設計資料結構編制一個演示單鏈的建立列印查詢插入刪除等操作的程式。

實驗題目 編制一個演示單鏈表的建立、列印、查詢、插入、刪除等操作的程式。 1.需求分析 要求用TC編寫一個演示程式,首先建立一個帶頭結點的整型單鏈表,然後根據使用者選擇,能夠在單鏈表的任意位置插入、刪除結點,以及確定某一元素在單鏈表中的位置。 1.1 建立單鏈

資料結構逆序輸出單鏈資料

思路:遞迴。形式為(輸出該資料之後的連結串列值)+輸出這個資料。 值得一提的是,如果帶有頭節點的單鏈表,需要前行前行一位,使連結串列指向開始節點。程式碼如下: void printDeverse_main(LinkList List) { List = List-&g

資料結構順序單鏈迴圈連結串列插入刪除

寫在前面的 順序表 插入 刪除 定位 單鏈表 插入 刪除 總結 寫在前面的        在複習資料結構的過程中對於連結串列的操作總是容易忘記,時不時的就不知道具體的該怎麼

資料結構順序的操作函式

SeqList.h #ifndef __SEQLIST_H__ #define __SEQLIST_H__ #include <stdio.h> #include <assert.h> #include <malloc.h> #include <window

資料結構順序應用1:多餘元素刪除之移位演算法

Problem Description 一個長度不超過10000資料的順序表,可能存在著一些值相同的“多餘”資料元素(型別為整型),編寫一個程式將“多餘”的資料元素從順序表中刪除,使該表由一個“非純表

資料結構順序的應用(1)

 問題: 1.將順序表(a1,a2,…,an)重新排列以a1為界的兩部分:a1前面的值均比a1小,a1後面的值均比a1大(這裡假設資料元素的型別具有可比性,不妨設為整型)。 #include "

資料結構順序的應用(2)

問題: 2.有順序表A和B,其元素均按從小到大的升序排列,編寫一個演算法,將它們合併成一個順序表C,要求C的元素也按從小到大的升序排列。 #include "stdio.h" #include "sequlist.h" int main () { int le

資料結構順序的應用(3)

問題: 已知一個順序表中的各節點值是從大到小有序的,設計一個演算法,插入一個值為x的節點,使順序表中的節點仍然是從小到大有序的。 #include "stdio.h" #include "seq

資料結構順序實現十進位制轉換任意進位制

/* & File : 進位制準換 * Author : Laugh * Copyright: Laugh * 主題 :對於輸入的任意一個非負十進位制小數,列印輸出與其等值的任意進位制小數 * Date : 2018/10/14 */

資料結構順序及其各個介面的實現

在聊順序表之前,我們先來說一下線性表。 什麼是線性表呢? 線性表是n個具有相同特性的資料元素的有限序列。線性表是一種在實際中廣泛使用的資料結構,常見的線性表有:順序表,連結串列,棧,佇列,字串.... 線性表在邏輯上是線性結構,也就是說是連續的一條直線。但在物理結構上並不一定是連續的,線

資料結構順序資料反轉

問題描述:一個滿的陣列長度(M+N)個元素,前M個表示一個數字,後N個表示另一個數字。寫演算法,使其倒置。 如:111111222222---->222222111111 思路:一個很高效的反覆,做3次翻轉,對M進行一次翻轉,對N一個翻轉,再對總體進行一次翻轉。

資料結構順序佇列的實現(C語言)

佇列的基本概念及其描述 佇列是一種特殊的線性表,它的特殊性在於佇列的插入和刪除操作分別在表的兩端進行。 插入的那一端稱為隊尾,刪除的那一端稱為隊首。佇列的插入操作和刪除操作分別稱為進隊和出隊。 先進先出(First In First Out) 順序佇列要掌握以下操作:

資料結構順序佇列

一、順序佇列的概念和分類 1、概念:順序佇列的底層結構是資料儲存元素的,用兩個整形數字來表示隊頭和隊尾的下標front和back 2、順序佇列根據出入元素方式不同分為兩種形式 二、程式碼展示 1、隊頭

資料結構用模版實現大小堆實現優先順序佇列,以及堆排序

    一、用模版實現大小堆    如果不用模版的話,寫大小堆,就需要分別實現兩次,但是應用模版的話問題就簡單多了,我們只需要實現兩個仿函式,Greater和Less就行了,仿函式就是用類實現一個()的過載就實現了仿函式。這個看下程式碼就能理解了。再設計引數的時候,需要把模版

資料結構二叉搜尋樹(增查)的遞迴非遞迴實現

前言:     二叉搜尋樹是二叉樹中的一種特殊結構,具有如下的性質: ➢每個節點都有一個作為搜尋依據的關鍵碼(key),所有節點的關鍵碼互不相同。 ➢左子樹上所有節點的關鍵碼(key)都小於根節點的關鍵碼(key)。 ➢右子樹上所有節點的關鍵碼(key)都大於根節點的關鍵碼

資料結構順序棧的實現(C語言)

棧的基本概念及其描述 棧是一種特殊的線性表,規定它的插入運算和刪除運算均線上性表的同一端進行,進行插入操作和刪除操作的那一端稱為棧頂,另一端稱為棧底。 棧的插入操作和刪除操作分別稱為進棧和出棧。 FILO(First In Last Out)後進先出/先進後出 eg

資料結構順序棧 Stack

#include "calculator.h" #include <iostream> using namespace std; //construction Calculator::Calculator(){ command=' '; } //get_command void Calcul

資料結構棧的應用---四則運算表示式求值(中綴表示式字尾表示式轉換)

用計算機實現帶括號的四則運算的方式。 這裡的困難在於乘除運算的優先順序高於加減運算,並且加入了括號,使得問題變得更加困難。 20世紀50年代,波蘭邏輯學家想到了一種不需要括號的字尾表達法,我們也把它稱為逆波蘭表示。 比如:9+(3-1)*3+10/2,如果

1資料結構線性結構單鏈

單向連結串列 一、定義:     單向連結串列(單鏈表)時連結串列的一種,它由節點組成,每個節點都包含下一個節點的指標。     單鏈表的特點是:節點的連結方向是單向的;相對於陣列來說,單鏈表的的隨機訪問速度較慢,但是單鏈表刪除/新增資料的效率很高。 二、實現:

資料結構靜態動態順序

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