資料結構:連結串列的初始化插入和刪除2.3.1
前面我們已經說了線性表的順序實現,
http://blog.itpub.net/7728585/viewspace-2124937/
下面我們將討論一下線性表的連結串列實現。
連結串列結構使用得非常多,不管是作業系統還是資料庫都是使用非常頻繁的一種資料結構,
由於其相對靈活的記憶體使用,並且快速的插入和刪除,都是非常有優勢的。
這裡透過C語言實現5個功能:
1、使用線性表的順序結構初始化連結串列結構
2、初始化連結串列結構為指定的大小
3、獲取連結串列中的指定位置的元素
4、在指定位置後面插入一個元素
5、刪除指定位置的元素
先來看一個大概的圖,說明是是加NODENEW加入到節點NODE1後面的情況,實際上刪除也是類似,具體實現看程式碼
首先我們需要定義個頭結點指向第一個NODE,NODE中有NEXT指標指向下一個結點,在這種結構中,
檢視固定元素的時間複雜度最壞也是O(n),而插入一元素時間複雜度為O(1),刪除一個元素複雜度也是O(1)
但是我們應該清楚如果要插入指定位置或者刪除指定位置的元素首先需要的是查詢,那麼需要的時間則是他們
相加。來看C語言實現,在整個程式碼檔案中沒有使用標頭檔案導致每個檔案都需要定義一些需要的定義!同時我
使用了函式過載來實現
1、使用線性表的順序結構初始化連結串列結構
2、初始化連結串列結構為指定的大小
不可避免的引入了一點點C++的知識
編譯:
g++ main.cpp chain.cpp sqlist.cpp -W
執行:
gaopeng@bogon:~/datas/part2/chain$ ./a.out
insert 5 values use seq mode
node:0 values is:25 data length:5 max_size:10
node:1 values is:20 data length:5 max_size:10
node:2 values is:15 data length:5 max_size:10
node:3 values is:10 data length:5 max_size:10
node:4 values is:5 data length:5 max_size:10
init chain use seq arrary
Max chain length is:5
node:1 values is: 25
node:2 values is: 5
node:3 values is: 10
node:4 values is: 15
node:5 values is: 20
view one node at postion 3
node 3 values is 10
add one node after node 2
Max chain length is:6
node:1 values is: 25
node:2 values is: 5
node:3 values is: 50
node:4 values is: 10
node:5 values is: 15
node:6 values is: 20
add one node at postion 2
Max chain length is:5
node:1 values is: 25
node:2 values is: 50
node:3 values is: 10
node:4 values is: 15
node:5 values is: 20
可以看到我初始化的連結串列為 25 5 10 15 20 檢視第三個元素為 10 在位置2後面插入一個元素50 變為
了 25 5 50 10 15 20 刪除位置2元素變為了 25 50 10 15 20
http://blog.itpub.net/7728585/viewspace-2124937/
下面我們將討論一下線性表的連結串列實現。
連結串列結構使用得非常多,不管是作業系統還是資料庫都是使用非常頻繁的一種資料結構,
由於其相對靈活的記憶體使用,並且快速的插入和刪除,都是非常有優勢的。
這裡透過C語言實現5個功能:
1、使用線性表的順序結構初始化連結串列結構
2、初始化連結串列結構為指定的大小
3、獲取連結串列中的指定位置的元素
4、在指定位置後面插入一個元素
5、刪除指定位置的元素
先來看一個大概的圖,說明是是加NODENEW加入到節點NODE1後面的情況,實際上刪除也是類似,具體實現看程式碼
首先我們需要定義個頭結點指向第一個NODE,NODE中有NEXT指標指向下一個結點,在這種結構中,
檢視固定元素的時間複雜度最壞也是O(n),而插入一元素時間複雜度為O(1),刪除一個元素複雜度也是O(1)
但是我們應該清楚如果要插入指定位置或者刪除指定位置的元素首先需要的是查詢,那麼需要的時間則是他們
相加。來看C語言實現,在整個程式碼檔案中沒有使用標頭檔案導致每個檔案都需要定義一些需要的定義!同時我
使用了函式過載來實現
1、使用線性表的順序結構初始化連結串列結構
2、初始化連結串列結構為指定的大小
不可避免的引入了一點點C++的知識
點選(此處)摺疊或開啟
-
順序表實現:
-
/*************************************************************************
-
> File Name: sqlist.cpp
-
> Author: gaopeng
-
> Mail: gaopp_200217@163.com
-
> Created Time: Wed 05 Oct 2016 02:44:35 AM CST
-
************************************************************************/
-
-
#include<iostream>
-
#include<stdio.h>
-
#include<stdlib.h>
-
#include<string.h>
-
#define INITSIZE 10
-
-
typedef unsigned int uint;
-
typedef int Etype;
-
-
typedef struct sqlist
-
{
-
Etype* elem; //pointer of sqlist base address
-
uint length; //current length of elem
-
uint m_size; //
-
} SQLIST;
-
-
-
void initsqlist(SQLIST* inlist)
-
{
-
-
inlist->elem = (Etype* )malloc(sizeof(Etype)*INITSIZE + 1);
-
inlist->length = 0;
-
inlist->m_size = INITSIZE; //maxsize
-
}
-
-
-
void initsqlinsert(SQLIST* inlist,Etype ielem,uint postion) //insert elem before postion
-
{
-
-
int i;
-
Etype* newbase;
-
if(postion > inlist->length + 1 || postion < 1)
-
{
-
-
printf("line table must continuous or postion must>0!\n");
-
exit(1);
-
}
-
-
if(inlist->length + 1 >= inlist->m_size ) //if memory small will give more memory
-
{
-
-
if(!(newbase =(Etype* )realloc(inlist->elem,(inlist->length+INITSIZE)* sizeof(Etype)+1)))
-
{
-
-
printf("mem alloc failed!\n");
-
exit(2);
-
}
-
inlist->elem = newbase;
-
inlist->m_size = inlist->m_size+INITSIZE;
-
}
-
-
for(i=0;i<(inlist->length-postion+2);i++) //every elem houyi
-
{
-
-
*(inlist->elem+inlist->length+1-i) = * (inlist->elem+inlist->length-i);
-
}
-
*(inlist->elem+inlist->length+1-i) = ielem; //give value
-
inlist->length =inlist->length+1;
-
}
-
-
void delsqldel(SQLIST* inlist,uint postion) //delete elem of postion
-
{
-
-
int i;
-
if((postion > inlist->length) ||(postion <1))
-
{
-
-
printf("give postion is must large than 1 and less than current length\n");
-
}
-
-
for(i=0;i<(inlist->length-postion) ;i++)
-
{
-
-
*(inlist->elem+postion+i) = *(inlist->elem+postion+i+1);
-
}
-
inlist->length =inlist->length-1;
-
}
-
-
void view(SQLIST* inlist)
-
{
-
-
int i;
-
if(inlist->length ==0 )
-
{
-
-
printf("init data arrary! no data found!\n");
-
exit(3);
-
}
-
for(i=0;i<inlist->length;i++)
-
{
-
-
printf("node:%d values is:%d data length:%d max_size:%d \n",i,*(inlist->elem+i),inlist->length,inlist->m_size);
-
}
- }
點選(此處)摺疊或開啟
-
連結串列實現:
-
#include<iostream>
-
#include<stdio.h>
-
#include <stdlib.h>
-
typedef int datatype;
-
typedef int Etype;
-
typedef unsigned int uint;
-
-
typedef struct node
-
{
-
datatype data;
-
struct node *next;
-
} Node,*Nodep;
-
-
typedef struct hnode
-
{
-
int clenth;
-
Nodep headp;
-
} Hnode,*Hnodep;
-
-
-
typedef struct sqlist
-
{
-
Etype* elem; //pointer of sqlist base address
-
uint length; //current length of elem
-
uint m_size; //
-
} SQLIST;
-
-
void initchain(Hnodep hnode,int n)
-
{
-
Nodep p;
-
int i;
-
hnode->clenth = 0;
-
hnode->headp = (Nodep)malloc(sizeof(Node));
-
hnode->headp->next = NULL;
-
hnode->headp->data = 0;
-
(hnode->clenth)++;
-
for(i=(n-1);i>0;--i)
-
{
-
p = (Nodep)malloc(sizeof(Node));
-
p->next = hnode->headp->next;
-
hnode->headp->next = p;
-
p->data = 0;
-
(hnode->clenth)++;
-
}
-
}
-
-
-
void initchain(Hnodep hnode,const SQLIST* sqdata)
-
{
-
Nodep p;
-
int i;
-
int t=1;
-
int sqlen = sqdata->length;
-
hnode->clenth = 0;
-
hnode->headp = (Nodep)malloc(sizeof(Node));
-
hnode->headp->next = NULL;
-
hnode->headp->data = *(sqdata->elem);
-
(hnode->clenth)++;
-
sqlen--;
-
for(i=sqlen;i>0;--i)//every time insert elem after first elem and before seconed elem
-
{
-
p = (Nodep)malloc(sizeof(Node));
-
p->next = hnode->headp->next;
-
hnode->headp->next = p;
-
p->data = *(sqdata->elem+t);
-
(hnode->clenth)++;
-
t++;
-
}
-
}
-
-
-
void viewchain(Hnodep hnode)
-
{
-
int i=1;
-
Nodep p;
-
int max_len;
-
p = hnode->headp;
-
max_len = hnode->clenth;
-
-
printf("Max chain length is:%d\n",max_len);
-
do
-
{
-
printf("node:%d values is: %d\n",i,p->data);
-
i++;
-
-
}while(p=p->next);
-
}
-
-
void getelem(Hnodep hnode,int postion)
-
{
-
int i=0;
-
Nodep p;
-
if(postion > hnode->clenth || postion ==0 )
-
{
-
printf("postion large than lenth or poastion = 0\n");
-
exit(4);
-
}
-
p = hnode->headp;
-
-
while(i<postion-1)
-
{
-
i++;
-
p = p->next;
-
}
-
-
printf("node %d values is %d\n",i+1,p->data);
-
-
}
-
-
-
Nodep getelemp(const Hnodep hnode,int postion) //insert one elem after postion
-
{
-
int i=0;
-
Nodep p;
-
if(postion > hnode->clenth || postion ==0 )
-
{
-
printf("postion large than lenth or poastion = 0\n");
-
exit(5);
-
}
-
p = hnode->headp;
-
-
while(i<postion-1)
-
{
-
i++;
-
p = p->next;
-
}
-
-
return p;
-
-
}
-
-
void addnode(Nodep inode,int postion,Hnodep hnode)//insert one elem after postion
-
{
-
Nodep p;
-
p = getelemp(hnode,postion);
-
if(!p->next) //end elem?
-
{
-
p->next = inode;
-
inode->next = NULL;
-
}
-
else
-
{
-
inode->next = p->next;
-
p->next = inode;
-
}
-
hnode->clenth++;
-
}
-
-
void delnode(int postion,Hnodep hnode) //delete elem at give postion
-
{
-
Nodep p1; //delete postion-1 p
-
Nodep p2; //delete postion p
-
-
if(postion == 1)
-
{
-
p2 = hnode->headp->next;
-
hnode->headp->next = hnode->headp->next->next;
-
free(p2);
-
}
-
else
-
{
-
p1=getelemp(hnode,postion-1);//find before delete node postion
-
p2 = p1->next;
-
p1->next = p1->next->next;
-
free(p2);
-
}
-
hnode->clenth--;
- }
點選(此處)摺疊或開啟
-
main 函式:
-
#include<iostream>
-
#include<stdio.h>
-
#include<stdlib.h>
-
-
-
typedef unsigned int uint;
-
typedef int Etype;
-
typedef int datatype;
-
-
typedef struct node
-
{
-
-
datatype data;
-
struct node *next;
-
} Node,*Nodep;
-
-
typedef struct hnode
-
{
-
-
int clenth;
-
Nodep headp;
-
} Hnode,*Hnodep;
-
-
-
typedef struct sqlist
-
{
-
-
Etype* elem; //pointer of sqlist base address
-
uint length; //current length of elem
-
uint m_size; //
-
} SQLIST;
-
-
void initchain(Hnodep hnode,int n);
-
void initchain(Hnodep hnode,const SQLIST* sqdata);
-
void viewchain(Hnodep hnode);
-
void view(SQLIST* inlist);
-
void delsqldel(SQLIST* inlist,uint postion);
-
void initsqlist(SQLIST* inlist);
-
void initsqlinsert(SQLIST* inlist,Etype ielem,uint postion);
-
void getelem(Hnodep hnode,int postion);
-
void addnode(Nodep inode,int postion,const Hnodep hnode);
-
void delnode(int postion,Hnodep hnode);
-
-
-
int main(void)
-
{
-
SQLIST a;
-
Hnode chd1;
-
Nodep newnode = (Nodep)malloc(sizeof(Node));
-
newnode->data=50;
-
newnode->next=NULL;
-
initsqlist(&a);
-
printf("insert 5 values use seq mode\n");
-
initsqlinsert(&a,5,1);
-
initsqlinsert(&a,10,1);
-
initsqlinsert(&a,15,1);
-
initsqlinsert(&a,20,1);
-
initsqlinsert(&a,25,1);
-
view(&a);
-
printf("\n\ninit chain use seq arrary\n");
-
initchain(&chd1,&a);
-
viewchain(&chd1);
-
printf("\n\nview one node at postion 3\n");
-
getelem(&chd1,3);
-
printf("\n\nadd one node after node 2\n");
-
addnode(newnode,2,&chd1);
-
viewchain(&chd1);
-
printf("\n\nadd one node at postion 2\n");
-
delnode(2,&chd1);
-
viewchain(&chd1);
-
return 0;
- }
編譯:
g++ main.cpp chain.cpp sqlist.cpp -W
執行:
gaopeng@bogon:~/datas/part2/chain$ ./a.out
insert 5 values use seq mode
node:0 values is:25 data length:5 max_size:10
node:1 values is:20 data length:5 max_size:10
node:2 values is:15 data length:5 max_size:10
node:3 values is:10 data length:5 max_size:10
node:4 values is:5 data length:5 max_size:10
init chain use seq arrary
Max chain length is:5
node:1 values is: 25
node:2 values is: 5
node:3 values is: 10
node:4 values is: 15
node:5 values is: 20
view one node at postion 3
node 3 values is 10
add one node after node 2
Max chain length is:6
node:1 values is: 25
node:2 values is: 5
node:3 values is: 50
node:4 values is: 10
node:5 values is: 15
node:6 values is: 20
add one node at postion 2
Max chain length is:5
node:1 values is: 25
node:2 values is: 50
node:3 values is: 10
node:4 values is: 15
node:5 values is: 20
可以看到我初始化的連結串列為 25 5 10 15 20 檢視第三個元素為 10 在位置2後面插入一個元素50 變為
了 25 5 50 10 15 20 刪除位置2元素變為了 25 50 10 15 20
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/7728585/viewspace-2125007/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 資料結構:單迴圈連結串列的建立插入與刪除資料結構
- 資料結構__連結串列_單連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 雙向連結串列的操作(插入和刪除)
- 資料結構_連結串列_單向迴圈連結串列 & 雙向連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 連結串列基礎2(超簡單)--單連結串列的插入和刪除
- 資料結構_連結串列_單向迴圈連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 資料結構_連結串列_雙向迴圈連結串列的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 資料結構之單連結串列的建立與刪除資料結構
- 資料結構_連結串列_雙向迴圈連結串列 & 棧 的初始化、插入、刪除、修改、查詢列印(基於C語言實現)資料結構C語言
- 雙向連結串列————查詢、刪除、插入結點
- 資料結構實驗之連結串列七:單連結串列中重複元素的刪除資料結構
- 單向迴圈連結串列——查詢、刪除、插入結點
- 資料結構—-連結串列的增和插入(2018/10/23)資料結構
- 單連結串列的插入刪除操作(c++實現)C++
- 實戰資料結構(2)_兩個單連結串列間的刪除操作資料結構
- C\C++之用結構體實現連結串列的建立、遍歷、結點插入、結點刪除C++結構體
- 資料結構-連結串列資料結構
- 資料結構 - 連結串列資料結構
- 連結串列-資料結構資料結構
- 資料結構--連結串列資料結構
- 資料結構—連結串列資料結構
- 單向加頭連結串列的[構建、插入、刪除、查詢、輸出]
- 資料結構-單連結串列、雙連結串列資料結構
- 資料結構之陣列和連結串列資料結構陣列
- JavaScript資料結構--連結串列JavaScript資料結構
- 資料結構之「連結串列」資料結構
- 資料結構之連結串列資料結構
- 為什麼陣列查詢比連結串列要快?而插入刪除比連結串列效率低陣列
- 連結串列基本操作(建立,插入,查詢,刪除)-C語言C語言
- 連結串列入門與插入連結串列
- 核心中的連結串列資料結構資料結構
- Redis資料結構—連結串列與字典的結構Redis資料結構
- Java版-資料結構-連結串列Java資料結構
- JavaScript資料結構 之 連結串列JavaScript資料結構
- 資料結構學習--連結串列資料結構
- 資料結構:跳躍連結串列資料結構
- js資料結構--連結串列(likedList)JS資料結構
- 資料結構基礎 連結串列資料結構