#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct node{
struct node *previous;
int age;
struct node *next;
}Node;
//創(chuàng)建一個結(jié)點
Node *createNode(){
//創(chuàng)建一個新德頭結(jié)點
Node *pTemp = (Node *)malloc(1 * sizeof(Node));
if (pTemp == NULL) {
return NULL;
}
//賦初值
pTemp->previous = NULL;
pTemp->next = NULL;
pTemp->age = 0;
//返回這個結(jié)點的地址
return pTemp;
}
//創(chuàng)建頭結(jié)點
bool createHeader(Node **pHeader){
//創(chuàng)建一個新德頭結(jié)點
*pHeader = createNode();
if (pHeader == NULL) {
return false;
} else {
return true;
}
}
//是否繼續(xù)
bool isContinue(){
char option;
do {
getchar();
printf("是否繼續(xù)添加(y/n)?:");
option = getchar();
} while (option != 'y' && option != 'n');
if (option == 'y') {
return true;
} else{
return false;
}
}
//initial
void initial(Node * const pHeader){
Node *pTail = pHeader;
//添加保存數(shù)據(jù)的結(jié)點
while (1) {
//需要創(chuàng)建一個結(jié)點
Node *pTemp = createNode();
if (pTemp == NULL) {
exit(EXIT_FAILURE);
}
printf("請輸入年齡:");
scanf("%d", &pTemp->age);
//判斷添加的位置
if (pHeader->next == NULL) {
//頭結(jié)點指向第一個結(jié)點
pHeader->next = pTemp;
//第一個結(jié)點的previous指向頭結(jié)點
pTemp->previous = pHeader;
//第一個結(jié)點的next指向頭結(jié)點
pTemp->next = pHeader;
//頭結(jié)點的previou指向第一個結(jié)點
pHeader->previous = pTemp;
//pTail指針指向第一個結(jié)點
pTail = pTemp;
} else{
//前面已經(jīng)存在結(jié)點了
//讓尾結(jié)點的next指向pTemp
pTail->next = pTemp;
//讓pTemp的previous指針指向目前的尾結(jié)點
pTemp->previous = pTail;
//讓pTail指向最后一個結(jié)點pTemp
pTail = pTemp;
//尾結(jié)點的next指針指向頭結(jié)點
pTail->next = pHeader;
//頭結(jié)點的previous指針指向尾結(jié)點
pHeader->previous = pTail;
}
//提問是否繼續(xù)
if (isContinue() == false){
break;
}
}
}
//輸出鏈表的內(nèi)容
void show(const Node * const pHeader){
Node *pTemp = pHeader->next;
while (pTemp != NULL) {
printf("%d ", pTemp->age);
pTemp = pTemp->next;
if (pTemp == pHeader) {
break;
}
}
printf("\n");
}
//獲取index對應(yīng)的結(jié)點的地址
Node *addressOfIndex(Node *pHead, int index){
Node *pTemp = pHead->next;
while (index > 0) {
if (pTemp == pHead) {
//節(jié)點數(shù)少于index
break;
}else{
pTemp = pTemp->next;
}
index--;
}
if (index > 0) {
printf("刪除的元素不存在\n");
return NULL;
}else{
//讓pTemp指向即將被我刪除的那個結(jié)點
pTemp = pTemp->previous;
return pTemp;
}
}
//插入一個元素
//刪除
void delete(Node *pHead, int index){
//獲取index對應(yīng)的結(jié)點的地址
Node *pIndex = addressOfIndex(pHead, index);
if (pIndex == NULL) {
printf("刪除的元素不存在\n");
exit(EXIT_FAILURE);
} else{
//讓index前面的結(jié)點next指針指向index后面的結(jié)點
pIndex->previous->next = pIndex->next;
//讓index后面的結(jié)點的previous指針指向index前面的結(jié)點
pIndex->next->previous = pIndex->previous;
free(pIndex);
}
}
void insert(Node *pHeader, int index, int element){
//首先獲取index對應(yīng)的結(jié)點的地址
Node *pIndex = addressOfIndex(pHeader, index);
if (pIndex == NULL) {
printf("刪除的元素不存在\n");
exit(EXIT_FAILURE);
} else{
//在index的前面插入一個元素
//為這個元素分配內(nèi)存空間
Node *pNew = createNode();
if (pNew == NULL) {
exit(EXIT_FAILURE);
}else{
pNew->age = element;
//讓new結(jié)點的next指針指向pIndex
pNew->next = pIndex;
//讓new結(jié)點的previous指針指向index前面一個結(jié)點的地址
pNew->previous = pIndex->previous;
//讓pIndex德previous指向pnew
pIndex->previous = pNew;
//讓index前面的結(jié)點的next指向pNew
pNew->previous->next = pNew;
}
}
}
int main(int argc, const char * argv[]) {
//定義一個指針 指向頭結(jié)點(頭結(jié)點不存數(shù)據(jù))
Node *pHead = NULL;
//創(chuàng)建頭結(jié)點
if (createHeader(&pHead) == false) {
//創(chuàng)建頭結(jié)點出錯了线罕。
exit(EXIT_FAILURE);
}
//初始化這個雙鏈表
initial(pHead);
show(pHead);
delete(pHead, 3);
show(pHead);
insert(pHead, 2, 100);
show(pHead);
return 0;
}
doubleLinkedList(雙鏈表)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
- 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來英融,“玉大人盏檐,你說我怎么就攤上這事∈晃颍” “怎么了胡野?”我有些...
- 文/不壞的土叔 我叫張陵,是天一觀的道長痕鳍。 經(jīng)常有香客問我硫豆,道長,這世上最難降的妖魔是什么? 我笑而不...
- 正文 為了忘掉前任够庙,我火速辦了婚禮恭应,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘耘眨。我一直安慰自己昼榛,他們只是感情好,可當(dāng)我...
- 文/花漫 我一把揭開白布剔难。 她就那樣靜靜地躺著胆屿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪偶宫。 梳的紋絲不亂的頭發(fā)上非迹,一...
- 文/蒼蘭香墨 我猛地睜開眼痹栖,長吁一口氣:“原來是場噩夢啊……” “哼亿汞!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起揪阿,我...
- 正文 年R本政府宣布琼开,位于F島的核電站易结,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜搞动,卻給世界環(huán)境...
- 文/蒙蒙 一躏精、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鹦肿,春花似錦矗烛、人聲如沸。這莊子的主人今日做“春日...
- 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至涣旨,卻和暖如春歪架,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背霹陡。 一陣腳步聲響...
推薦閱讀更多精彩內(nèi)容
- 靜態(tài)鏈表 用數(shù)組描述的鏈表叫做靜態(tài)鏈表洛口; 數(shù)組的元素由兩部分組成矫付, data和cur, data存儲數(shù)據(jù)第焰;cur存...
- 聯(lián)合體 聯(lián)合體:多個成員變量公用同一塊空間,一個時間段只能用其中的一個成員.如果成員變量都是基本數(shù)據(jù)類型,那么這個...
- 最近在復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu)時挺举,感觸頗深杀赢。 推薦程序員們有時間都可以復(fù)習(xí)下, 數(shù)據(jù)結(jié)構(gòu)不僅僅是一門課程湘纵, 它更能理清我們開發(fā)...
- 1. 循環(huán)鏈表 與單鏈表基本無異脂崔,但有如下兩點需要注意:(1)最后一結(jié)點的指針域必須指向頭結(jié)點,這樣才能循環(huán)(注意...