資料結構—連結串列元素的刪除和插入
連結串列相對於線性表的優點就在於插入和刪除十分方便。
那麼我用一個有意思的比喻來描述一下這個過程。
插入:
小紅和小琴是好閨蜜,她們天天都拉著手(找男的比喻不大好啊,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