C語言實(shí)現(xiàn)數(shù)據(jù)結(jié)構(gòu)和雙向鏈表操作
數(shù)據(jù)結(jié)構(gòu) 雙向鏈表的實(shí)現(xiàn)
雙向鏈表中的每一個結(jié)點(diǎn)都含有兩個指針域,一個指針域存放其后繼結(jié)點(diǎn)的存儲地址,另一個指針域則存放其前驅(qū)結(jié)點(diǎn)的存儲地址。
雙向鏈表結(jié)點(diǎn)的類型描述:
//雙向鏈表的類型描述
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *prior,*next;
}DuLNode,*DuLinkList;
其中,prior域存放的是其前驅(qū)結(jié)點(diǎn)的存儲地址,next域存放的是其后繼結(jié)點(diǎn)的存儲地址。
雙向鏈表有兩個特點(diǎn):
一是可以從兩個方向搜索某個結(jié)點(diǎn),這使得鏈表的某些操作(如插入和刪除)變得比較簡單; 二是無論利用前鏈還是后鏈都可以遍歷整個雙向鏈表。
雙向鏈表的操作基本和單鏈表的操作相同;
1. 頭插法創(chuàng)建帶頭結(jié)點(diǎn)的雙向鏈表Create_DLinkListF(int n)
//頭插法創(chuàng)建帶頭結(jié)點(diǎn)的雙向鏈表
DuLinkList Create_DLinkListF(int n){
DuLinkList L,p;
int i = n - 1;
ElemType x;
//新建頭結(jié)點(diǎn)
L = (DuLinkList)malloc(sizeof(DuLNode));
L->prior = NULL;
L->next = NULL;
//添加第一個結(jié)點(diǎn)
scanf("%d",&x);
p = (DuLinkList)malloc(sizeof(DuLNode));
p->data = x;
L->next = p;
p->prior = L;
p->next = NULL;
//加入其他結(jié)點(diǎn)
while(i > 0){
scanf("%d",&x);
p = (DuLinkList)malloc(sizeof(DuLNode));
p->data = x;
p->next = L->next;
L->next->prior = p;
p->prior = L;
L->next = p;
i--;
}
return L;
}
2. 尾插法創(chuàng)建帶頭結(jié)點(diǎn)的雙向鏈表Create_DLinkListR(int n)
//尾插法創(chuàng)建帶頭結(jié)點(diǎn)的雙向鏈表
DuLinkList Create_DLinkListR(int n){
DuLinkList L,p,lastNode;
int i = n - 1;
ElemType x;
//新建頭結(jié)點(diǎn)
L = (DuLinkList)malloc(sizeof(DuLNode));
L->prior = NULL;
L->next = NULL;
//添加第一個結(jié)點(diǎn)
scanf("%d",&x);
p = (DuLinkList)malloc(sizeof(DuLNode));
p->data = x;
L->next = p;
p->prior = L;
p->next = NULL;
lastNode = p;
//加入其他結(jié)點(diǎn)
while(i > 0){
scanf("%d",&x);
p = (DuLinkList)malloc(sizeof(DuLNode));
p->data = x;
lastNode->next = p;
p->prior = lastNode;
p->next = NULL;
lastNode = p;
i--;
}
return L;
}
3. 在指定結(jié)點(diǎn)之前插入新結(jié)點(diǎn)Insert_DLinkListBefore(DuLinkList p,ElemType x)
//在指定結(jié)點(diǎn)之前插入新結(jié)點(diǎn)
void Insert_DLinkListBefore(DuLinkList p,ElemType x){
DuLinkList newNode;
//判斷結(jié)點(diǎn)p之前的結(jié)點(diǎn)的合法性:
if(p->prior == NULL)
printf("結(jié)點(diǎn)不合法,不能在該結(jié)點(diǎn)之前插入結(jié)點(diǎn)\n");
else{
newNode = (DuLinkList)malloc(sizeof(DuLNode));
newNode->data = x;
newNode->next = p;
p->prior->next = newNode;
newNode->prior = p->prior;
p->prior = newNode;
}
}
4. 在指定結(jié)點(diǎn)之后插入新結(jié)點(diǎn)Insert_DLinkListAfter(DuLinkList p,ElemType x)
//在指定結(jié)點(diǎn)之后插入新結(jié)點(diǎn)
void Insert_DLinkListAfter(DuLinkList p,ElemType x){
DuLinkList newNode;
newNode = (DuLinkList)malloc(sizeof(DuLNode));
newNode->data = x;
//當(dāng)插入位置是最后一個結(jié)點(diǎn)之后時
if(p->next == NULL){
p->next = newNode;
newNode->prior = p;
newNode->next = NULL;
}
else{
newNode->next = p->next;
p->next->prior = newNode;
p->next = newNode;
newNode->prior = p;
}
}
5. 刪除指定結(jié)點(diǎn)Delete_DLinkList(DuLinkList p)
//刪除指定結(jié)點(diǎn)
void Delete_DLinkList(DuLinkList p){
//如果刪除的是最后一個元素
if(p->next == NULL)
p->prior->next = NULL;
else{
p->prior->next = p->next;
p->next->prior = p->prior;
}
free(p);
}
6. 后鏈輸出雙向鏈表Print_DLinkListN(DuLinkList L)
//后鏈輸出雙向鏈表
void Print_DLinkListN(DuLinkList p){
while(p != NULL){
printf("%d\t",p->data);
p = p->next;
}
printf("\n");
}
7.前鏈輸出雙向鏈表Print_DLinkListP(DuLinkList p)
//前鏈輸出雙向鏈表
void Print_DLinkListP(DuLinkList p){
while(p != NULL){
printf("%d\t",p->data);
p = p-prior;
}
printf("\n");
}
至于雙向鏈表的其他操作,如定位,和單鏈表的操作類同,不再贅述。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
相關(guān)文章
C語言使用單鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言使用單鏈表實(shí)現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-11-11
用c語言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個數(shù)
本篇文章是對使用c語言實(shí)現(xiàn)2000內(nèi)既能被3整除又能被7整除的個數(shù),用實(shí)例進(jìn)行了分析說明,需要的朋友參考下2013-05-05
在matlab中實(shí)現(xiàn)for循環(huán)的方法
for循環(huán)用來循環(huán)處理數(shù)據(jù),break用于終止離它最近的一層for循環(huán),continue用于跳過離它最近的一層for循環(huán),接著執(zhí)行下一次循環(huán),本文重點(diǎn)給大家介紹在matlab中實(shí)現(xiàn)for循環(huán)的方法,感興趣的朋友一起看看吧2021-11-11
C++示例分析內(nèi)聯(lián)函數(shù)與引用變量及函數(shù)重載的使用
為了消除函數(shù)調(diào)用的時空開銷,C++ 提供一種提高效率的方法,即在編譯時將函數(shù)調(diào)用處用函數(shù)體替換,類似于C語言中的宏展開。這種在函數(shù)調(diào)用處直接嵌入函數(shù)體的函數(shù)稱為內(nèi)聯(lián)函數(shù)(Inline Function),又稱內(nèi)嵌函數(shù)或者內(nèi)置函數(shù)2022-08-08

