#include <stdio.h>
#include <stdbool.h>
#include <stdlib.h>
typedef struct node{
struct node *previous;
int age;
struct node *next;
}Node;
//創(chuàng)建一個(gè)結(jié)點(diǎn)
Node *createNode(){
//創(chuàng)建一個(gè)新德頭結(jié)點(diǎn)
Node *pTemp = (Node *)malloc(1 * sizeof(Node));
if (pTemp == NULL) {
return NULL;
}
//賦初值
pTemp->previous = NULL;
pTemp->next = NULL;
pTemp->age = 0;
//返回這個(gè)結(jié)點(diǎn)的地址
return pTemp;
}
//創(chuàng)建頭結(jié)點(diǎn)
bool createHeader(Node **pHeader){
//創(chuàng)建一個(gè)新德頭結(jié)點(diǎn)
*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é)點(diǎn)
while (1) {
//需要?jiǎng)?chuàng)建一個(gè)結(jié)點(diǎn)
Node *pTemp = createNode();
if (pTemp == NULL) {
exit(EXIT_FAILURE);
}
printf("請(qǐng)輸入年齡:");
scanf("%d", &pTemp->age);
//判斷添加的位置
if (pHeader->next == NULL) {
//頭結(jié)點(diǎn)指向第一個(gè)結(jié)點(diǎn)
pHeader->next = pTemp;
//第一個(gè)結(jié)點(diǎn)的previous指向頭結(jié)點(diǎn)
pTemp->previous = pHeader;
//第一個(gè)結(jié)點(diǎn)的next指向頭結(jié)點(diǎn)
pTemp->next = pHeader;
//頭結(jié)點(diǎn)的previou指向第一個(gè)結(jié)點(diǎn)
pHeader->previous = pTemp;
//pTail指針指向第一個(gè)結(jié)點(diǎn)
pTail = pTemp;
} else{
//前面已經(jīng)存在結(jié)點(diǎn)了
//讓尾結(jié)點(diǎn)的next指向pTemp
pTail->next = pTemp;
//讓pTemp的previous指針指向目前的尾結(jié)點(diǎn)
pTemp->previous = pTail;
//讓pTail指向最后一個(gè)結(jié)點(diǎn)pTemp
pTail = pTemp;
//尾結(jié)點(diǎn)的next指針指向頭結(jié)點(diǎn)
pTail->next = pHeader;
//頭結(jié)點(diǎn)的previous指針指向尾結(jié)點(diǎn)
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對(duì)應(yīng)的結(jié)點(diǎn)的地址
Node *addressOfIndex(Node *pHead, int index){
Node *pTemp = pHead->next;
while (index > 0) {
if (pTemp == pHead) {
//節(jié)點(diǎn)數(shù)少于index
break;
}else{
pTemp = pTemp->next;
}
index--;
}
if (index > 0) {
printf("刪除的元素不存在\n");
return NULL;
}else{
//讓pTemp指向即將被我刪除的那個(gè)結(jié)點(diǎn)
pTemp = pTemp->previous;
return pTemp;
}
}
//插入一個(gè)元素
//刪除
void delete(Node *pHead, int index){
//獲取index對(duì)應(yīng)的結(jié)點(diǎn)的地址
Node *pIndex = addressOfIndex(pHead, index);
if (pIndex == NULL) {
printf("刪除的元素不存在\n");
exit(EXIT_FAILURE);
} else{
//讓index前面的結(jié)點(diǎn)next指針指向index后面的結(jié)點(diǎn)
pIndex->previous->next = pIndex->next;
//讓index后面的結(jié)點(diǎn)的previous指針指向index前面的結(jié)點(diǎn)
pIndex->next->previous = pIndex->previous;
free(pIndex);
}
}
void insert(Node *pHeader, int index, int element){
//首先獲取index對(duì)應(yīng)的結(jié)點(diǎn)的地址
Node *pIndex = addressOfIndex(pHeader, index);
if (pIndex == NULL) {
printf("刪除的元素不存在\n");
exit(EXIT_FAILURE);
} else{
//在index的前面插入一個(gè)元素
//為這個(gè)元素分配內(nèi)存空間
Node *pNew = createNode();
if (pNew == NULL) {
exit(EXIT_FAILURE);
}else{
pNew->age = element;
//讓new結(jié)點(diǎn)的next指針指向pIndex
pNew->next = pIndex;
//讓new結(jié)點(diǎn)的previous指針指向index前面一個(gè)結(jié)點(diǎn)的地址
pNew->previous = pIndex->previous;
//讓pIndex德previous指向pnew
pIndex->previous = pNew;
//讓index前面的結(jié)點(diǎn)的next指向pNew
pNew->previous->next = pNew;
}
}
}
int main(int argc, const char * argv[]) {
//定義一個(gè)指針 指向頭結(jié)點(diǎn)(頭結(jié)點(diǎn)不存數(shù)據(jù))
Node *pHead = NULL;
//創(chuàng)建頭結(jié)點(diǎn)
if (createHeader(&pHead) == false) {
//創(chuàng)建頭結(jié)點(diǎn)出錯(cuò)了。
exit(EXIT_FAILURE);
}
//初始化這個(gè)雙鏈表
initial(pHead);
show(pHead);
delete(pHead, 3);
show(pHead);
insert(pHead, 2, 100);
show(pHead);
return 0;
}
doubleLinkedList(雙鏈表)
最后編輯于 :
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- 靜態(tài)鏈表 用數(shù)組描述的鏈表叫做靜態(tài)鏈表; 數(shù)組的元素由兩部分組成, data和cur, data存儲(chǔ)數(shù)據(jù);cur存...
- 聯(lián)合體 聯(lián)合體:多個(gè)成員變量公用同一塊空間,一個(gè)時(shí)間段只能用其中的一個(gè)成員.如果成員變量都是基本數(shù)據(jù)類型,那么這個(gè)...
- 最近在復(fù)習(xí)數(shù)據(jù)結(jié)構(gòu)時(shí),感觸頗深。 推薦程序員們有時(shí)間都可以復(fù)習(xí)下, 數(shù)據(jù)結(jié)構(gòu)不僅僅是一門課程, 它更能理清我們開發(fā)...
- 1. 循環(huán)鏈表 與單鏈表基本無異,但有如下兩點(diǎn)需要注意:(1)最后一結(jié)點(diǎn)的指針域必須指向頭結(jié)點(diǎn),這樣才能循環(huán)(注意...