1. 程式人生 > >資料結構—連結串列元素的刪除和插入

資料結構—連結串列元素的刪除和插入

連結串列相對於線性表的優點就在於插入和刪除十分方便。
那麼我用一個有意思的比喻來描述一下這個過程。

插入:

小紅和小琴是好閨蜜,她們天天都拉著手(找男的比喻不大好啊,23333)
咳咳,就是這樣(圖中藍色上衣的是小紅,綠色裙子的是小琴)
這裡寫圖片描述
小紅的手和小琴的手拉著一起

之後有一個女生名字叫小美也想加入她們,和她們成為好閨蜜,那麼就成了這樣了 →_→
(我不是故意的)
這裡寫圖片描述

這樣小紅的手和小琴的手就不拉在一起了,反而小紅的手和小美的左手拉在一起,小美的右手與小琴的手拉在一起了。(這裡的左右手是我們的視角看到的左右手)

現在把小紅、小琴、小美各作為一個節點即節點a,節點b,節點k。
原來的情形是小紅和小琴的手天天拉著:
a->next = b;


那麼之後呢小美插進兩人之間:
k->next = a->next; //小美的右手牽著曾經小紅牽著的小琴
a->next = k; //小紅牽著小美的左手

void Push_L(LinkList &L, int data, int i)
{
    Node *p = L;
    int j = 1;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    Node *q = (LinkList)malloc(sizeof(Node));
    q->data = data;
    q->next = p->next;
    p->next = q;
} 

刪除:

因為小紅和小琴兩人嫉妒小美的貌美,就不接受她繼續在她們兩者之間了,那麼就要把小美“踢”出去。
a->next = k->next;//小紅繼續和小琴牽著手
free(k); //小美成了獨立人2333

void Delete_L(LinkList &L,int i)
{
    LinkList p = L;
    if(i<0)
    printf("INFEASIBLE");
    int j = 1;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    Node *q = p->next;
    p->next = p->next->next;
    free(q);
}

實現的整個程式碼:

#include<stdio.h>
#include<stdlib.h>
typedef struct node{
    int data;
    struct node *next;
}Node,*LinkList;

/*建立一個新連結串列*/
void CreatList_L(LinkList &L,int n)
{
    int a; 
    L = (LinkList)malloc(sizeof(Node));
    L->next = NULL;//建立一個帶頭結點的單鏈表 
    Node *q = L; 
    for(int i=0;i<n;i++)
    {
        Node *p = (LinkList)malloc(sizeof(Node));
        scanf("%d",&a);
        p->data = a;
        q->next = p;
        p->next=NULL;
        q = q->next;
    }
}

/*在連結串列的第i處插入一個元素*/
void Push_L(LinkList &L, int data, int i)
{
    Node *p = L;
    int j = 1;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    Node *q = (LinkList)malloc(sizeof(Node));
    q->data = data;
    q->next = p->next;
    p->next = q;
} 

/*刪除第i個元素*/ 
void Delete_L(LinkList &L,int i)
{
    Node *p = L;
    if(i<0)
    printf("INFEASIBLE");
    int j = 1;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    Node *q = p->next;
    p->next = p->next->next;
    free(q);
}
void Traverse_L(LinkList &L)
{
    LinkList p = L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p = p->next;
    }
    printf("\n");
}//正序遍歷整個連結串列 

int main()
{
    LinkList L;
    int n;
    printf("輸入要建立的連結串列中的元素個數:\n");
    scanf("%d",&n);
    printf("輸入%d個元素:\n",n);
    CreatList_L(L,n);
    printf("遍歷整個連結串列\n");
    Traverse_L(L);

    int push_data,push_i;
    printf("輸入你想要插入的元素和它的插入位置:\n");
    {
        scanf("%d%d",&push_data,&push_i);
    }
    Push_L(L, push_data, push_i);
    printf("插入後的連結串列遍歷為:\n");
    Traverse_L(L);

    int del_i;
    printf("輸入要刪除連結串列中的第幾個元素:\n");
    scanf("%d", &del_i);
    Delete_L(L, del_i);

    printf("刪除後的連結串列遍歷為:\n");
    Traverse_L(L);
    return 0;    
}

效果圖:

這裡寫圖片描述

———————————————分割線————————————————–

今天資料結構上機實驗要實現字串連結串列,改一下資料型別就行,新增頭插法:
(Ps:老師竟然讓手抄實驗報告,我內心是拒絕的,讓我們照著敲挺沒意義的,想學的人照樣會學,不學的人你給他程式碼,照著打一遍後就忘了,何必呢?我覺得最好的學習方式就是先自己思考,實在不會再提供提示或參考,這樣效果是最佳的!!)

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct node{
    char data[10];
    struct node *next;
}Node,*LinkList;

/*建立一個新連結串列(尾插法)*/
void CreatList_tail(LinkList &L)
{
    L = (LinkList)malloc(sizeof(Node));
    L->next = NULL;//建立一個帶頭結點的單鏈表 
    Node *q = L; 
    while(1)
    {
        char ch[10];
        printf("Input # to end ");
        printf("Please input Node_data:");
        Node *p = (LinkList)malloc(sizeof(Node));

        scanf("%s", ch);
        if(strcmp(ch, "#") == 0) break;
        strcpy(p->data, ch);
        q->next = p;
        p->next = NULL;
        q = q->next;
    }
    return;
}

/*頭插法*/ 
void CreatList_head(LinkList &L)
{
    L = (LinkList)malloc(sizeof(Node));
    L->next = NULL;//建立一個帶頭結點的單鏈表 
    while(1)
    {
        char ch[10];
        printf("Input # to end ");
        printf("Please input Node_data:");
        Node *p = (LinkList)malloc(sizeof(Node));

        scanf("%s", ch);
        if(strcmp(ch, "#") == 0) break;
        strcpy(L->data, ch);
        p->next = L;
        L = p;
    }
    return;
}

/*按值查詢結點,找到則返回該結點的位置,否則返回NULL*/
Node *LocateNode(LinkList L, char *ch)
{
    Node *p = L;
    while(p!=NULL && strcmp(p->data, ch) != 0)
    {
        p = p->next;
    } 
     return p;
}

/*在連結串列的第i處插入一個元素*/
void Push_L(LinkList &L, char *ch, int i)
{
    Node *p = L;
    int j = 0;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    Node *q = (LinkList)malloc(sizeof(Node));
    strcpy(q->data, ch);
    q->next = p->next;
    p->next = q;
} 

/*刪除元素*/ 
void Delete_L(LinkList &L, char *ch)
{
    Node *p = L;
    while(strcmp(p->next->data, ch)!=0)
    {
        p=p->next;
    }
    Node *q = p->next;
    p->next = p->next->next;
    free(q);
}

void Traverse_L(LinkList &L)
{
    LinkList p = L->next;
    while(p!=NULL){
        printf("%s, ",p->data);
        p = p->next;
    }
    printf("\n");
}//正序遍歷整個連結串列 

//void Inverted_L(LinkList &L1,LinkList &L2)
//{
//    Node *p1 = L1->next;
//    L2 = (LinkList)malloc(sizeof(Node));
//    L2->next=NULL;
//    while(p1!=NULL)
//    {
//        Node *p2 = (LinkList)malloc(sizeof(Node));
//        strcpy(p2->data, p1->data);
//        p2->next=L2->next;
//        L2->next=p2;
//        p1=p1->next;
//    }
//}

int main()
{
    LinkList L1;
    char num[5];
    char ch[10];
    CreatList_head(L1);
    Traverse_L(L1);

    printf("Delete node (y/n):");
    scanf("%s",num);
    if(strcmp(num, "y")==0 || strcmp(num, "Y")==0)
    {
        printf("Please input Delete_data:");
        scanf("%s",ch);
        Delete_L(L1, ch);       
        Traverse_L(L1);
    }

    printf("Insert node (y/n):");
    scanf("%s", num);
    if(strcmp(num, "y")==0 || strcmp(num, "y")==0)
    {
        char push_data[10];
        int push_i;
        printf("Please input a New Node_data:");
        scanf("%s",push_data);
        printf("postion :");
        scanf("%d",&push_i);
        Push_L(L1, push_data, push_i);
        Traverse_L(L1);
    }
    return 0;    
}

這裡寫圖片描述

相關推薦

資料結構連結串列元素刪除插入

連結串列相對於線性表的優點就在於插入和刪除十分方便。 那麼我用一個有意思的比喻來描述一下這個過程。 插入: 小紅和小琴是好閨蜜,她們天天都拉著手(找男的比喻不大好啊,23333) 咳咳,就是這樣(圖中藍色上衣的是小紅,綠色裙子的是小琴) 小紅的

資料結構連結串列題目1:查詢、插入刪除基本操作 解析

1.連結串列的查詢插入刪除 有問題的程式碼: #include<iostream> #define ok 0 #define error -1 using namespace std; class ListNode { public: int data; ListNode

資料結構 連結串列的建立,求連結串列的長度,插入元素等操作程式碼展示

 今上午老師佈置的作業,很不情願的寫了個單鏈表。。。發現長時間不寫確實很難一步寫對,除錯了20分鐘,可算是寫完了, 感覺應該是對了,測了幾組資料沒啥問題..... 程式碼如下: #include <cstdio> #include <cstring&g

資料結構——連結串列(1)如何找出連結串列中的倒數第k個元素

方法一:①遍歷連結串列,得到連結串列的長度n的值;②將倒數的k的序號轉換到順序排號(n-k+1);③遍歷連結串列,直到找到第(n-k+1)個元素。兩次遍歷,時間複雜度為O(n)。 方法二:從第一個元素開始,遍歷k個元素,判斷呢是否為NULL,若為空,則找到第k

資料結構連結串列 -- 查詢倒數第N個元素、中間元素、建立連結串列

#include<iostream> using namespace std; typedef int Status; typedef int ElemType; #define OK 1 #define ERROR 0 #define MAXSIZE 10

js資料結構 -- 連結串列, 雙向連結串列,迴圈連結串列

陣列作為js常用的資料結構,存取元素都非常的方便,但是其內部的實現原理跟其他計算機語言對陣列的實現都是一樣的。 由於陣列在記憶體中的儲存是連續的,所以當在陣列的開頭或者中間插入元素時,內部都需要去移動其他元素的位置,這個移動元素的成本很高。 連結串列也是儲存有序的元素集合,但不同

資料結構連結串列題目2:交換位置、3:合併

利用查詢、提取資料、插入、刪除、輸出等函式,順利搞定第二題 #include<iostream> #define ok 0 #define error -1 using namespace std; class ListNode { public: int data; List

Python資料結構-連結串列

1)概念:連結串列是一種物理儲存單元上非連續、非順序的儲存結構,資料元素的邏輯順序是通過連結串列中的指標連結次序實現的。連結串列由一系列結點(連結串列中每一個元素稱為結點)組成,結點可以在執行時動態生成。每個結點包括兩個部分:一個是儲存資料元素的資料域,另一個是儲存下一個結點地址的指標域。 相比於線性表順序結

資料結構 筆記:選擇排序插入排序

選擇排序的基本思想 -每次(例如底 i 次,i = 0 ,1,...,n-2)從後面n-i個待排的資料元素中選出關鍵字最小的元素,作為有序元素序列底 i 個元素. template <typename T> static void Select(T array[] , i

資料結構--連結串列

    定義         n個節點離散分配         彼此通過指標相連        &n

java中的資料結構——連結串列

連結串列 連結串列也是線性資料結構,與陣列相比,在記憶體分配、內部結構及資料插入和刪除的操作上均有不同。 連結串列用途廣泛,適用於許多通用的資料庫,也可以取代陣列,作為其他儲存結構的基礎。 在連結串列中,每個資料項都被包含在鏈節點中,一個鏈節點是某個類的物件,這個類叫做Link。因為一個

Redis底層資料結構--連結串列

這是普通的連結串列實現, 連結串列結點不直接持有資料, 而是通過void *指標來間接的指向資料. 其實現位於 src/adlist.h與src/adlist.c中, 關鍵定義如下: typedef struct listNode { struct listNode *prev

資料結構 - 連結串列

連結串列   之前講到的動態陣列、棧、佇列,底層都是依託靜態陣列,靠resize解決固定容量問題。而連結串列是一種真正的動態線性的資料結構。     *最簡單的動態資料結構   *更加深入理解引用   *更深入的理解遞迴   *輔組組成其他資料結構      資料儲存在節點(Node

資料結構-連結串列-練習題1

題目 2.已知一個帶表頭結點的單鏈表,結點結構為data、link,假設該連結串列只給出了頭指標list。 在不改變連結串列的前提下,請設計一個儘可能高效的演算法,查詢連結串列中倒數第k個位置上的結點(k正為整數)。 若查詢成功,演算法輸出該結點的data域的值,並返回1

前端也需要了解的資料結構-連結串列

前言 最近被小夥伴問到連結串列是什麼,連結串列作為一種常見的資料結構,但是很多前端coder對此並不瞭解,寫下這篇文章,介紹下連結串列的js實現,不瞭解連結串列的同學也可以做個參考 單向連結串列 和陣列區別,地址離散。它在記憶體地址中可以離散的分配,由於它是離散的分配,所以他可以

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

一、連結串列為什麼存在?       1).陣列的缺陷                    無序列表:搜尋效能差,有序列表:插入效率低,並且兩個的刪除效率也很低,陣列在

資料結構-連結串列(java實現)

/** * 連結串列節點定義 * */ private class Node { private Object data; private Node next; public Node getNext() { return next;

資料結構連結串列經典面試題

 連結串列面試題: 從尾到頭列印單鏈表 刪除一個無頭單鏈表的非尾節點(不能遍歷連結串列) 在無頭單鏈表的一個節點前插入一個節點(不能遍歷連結串列) 單鏈表實現約瑟夫環(JosephCircle) 逆置/反轉單鏈表 單鏈表排序(氣泡排序&快速排序) 合併

演算法導論---資料結構----連結串列

資料結構----連結串列 連結串列的每個元素都是一個物件x,x.key(鍵值),x.prev(上一個指標), x.next(下一個指標),x.head(表頭) 雙向連結串列:x.prev, x.next,x.head 單向連結串列:x.next,x.head 迴圈連結

資料結構——連結串列求兩集合的交集

#include <stdio.h> #include <malloc.h> typedef struct Node { int data; struct Node *next; }LNode,*LinkList; LNode *C