實現乙個有頭結點有環的雙鏈表

2021-08-18 07:17:59 字數 4810 閱讀 7176

在之前的部落格裡我們講到了不帶頭節點不帶環的單向鍊錶,今天我們來實現乙個有頭結點有環的雙向鍊錶。

我們首先設定乙個頭結點,這個頭結點的資料是無意義的,我們再設定乙個環,讓這個鍊錶的尾巴指向頭稱為乙個帶環鍊錶。相比於之前的單向鍊錶,這次我們多加了乙個prev指標,成為雙向鍊錶。如圖就是我們的有頭有環的雙向鍊錶。畫的太醜了....

話不多說,直接看**

dlinklist.h

#pragma once

#include #include typedef char dlinktype;

typedef struct dlinknodedlinknode;

void dlinklistinit(dlinknode** head);//初始化

void dlinklistpushback(dlinknode* head,dlinktype value);//尾插

void dlinklistpopback(dlinknode* head);//尾刪

void dlinklistpushfront(dlinknode* head,dlinktype value);//頭插

void dlinklistpopfront(dlinknode* head);//頭刪

dlinknode* dlinklistfind(dlinknode* head,dlinktype to_find);//查詢

void dlinklistinsertbefore(dlinknode* pos,dlinktype value);//任意位置之前插入

void dlinklistinsertafter(dlinknode* pos,dlinktype value);//任意位置之後插入

void dlinklisterase(dlinknode* pos);//任意位置刪除

void dlinklistremove(dlinknode* head,dlinktype to_delete);//根據元素刪除鍊錶中第乙個指定元素

void dlinklistremoveall(dlinknode* head,dlinktype to_delete);//根據元素刪除鍊錶中所有指定元素

size_t dlinklistsize(dlinknode* head);//鍊錶長度

int dlinklistempty(dlinknode* head);//判斷鍊錶是否為空

dlinklist.c

#include #include #include "dlinklist.h"

dlinknode* creatdnode(dlinktype value)

void dlinklistprint(dlinknode* head)

printf("\n");

while(cur2 != head)

printf("\n");

}void dlinklistinit(dlinknode** head)

*head = creatdnode(0);

}void dlinklistpushback(dlinknode* head,dlinktype value)

dlinknode* tail = head->prev;

dlinknode* new_node = creatdnode(value);

tail->next = new_node;

new_node->prev = tail;

head->prev = new_node;

new_node->next = head;

}void destory(dlinknode* cur)//銷毀函式

void dlinklistpopback(dlinknode* head)//尾刪

dlinknode* delete = head->prev;

dlinknode* tail = delete->prev;

tail->next = head;

head->prev = tail;

destory(delete);

}void dlinklistpushfront(dlinknode* head,dlinktype value)//頭插

dlinknode* new_node = creatdnode(value);

dlinknode* after = head->next;

head->next = new_node;

new_node->prev = head;

new_node->next = after;

after->prev = new_node;

}void dlinklistpopfront(dlinknode* head)//頭刪

dlinknode* delete = head->next;

dlinknode* after = delete->next;

head->next = after;

after->prev = head;

destory(delete);

}dlinknode* dlinklistfind(dlinknode* head,dlinktype to_find)//查詢元素

dlinknode* cur = head->next;

while(cur != head)

else

}return null;

}void dlinklistinsertbefore(dlinknode* pos,dlinktype value)//任意位置之前插入

dlinknode* before = pos->prev;

dlinknode* new_node = creatdnode(value);

before->next = new_node;

new_node->prev = before;

new_node->next = pos;

pos->prev = new_node;

}void dlinklistinsertafter(dlinknode* pos,dlinktype value)//任意位置之後插入

dlinknode* after = pos->next;

dlinknode* new_node = creatdnode(value);

pos->next = new_node;

new_node->prev = pos;

new_node->next = after;

after->prev = new_node;

}void dlinklisterase(dlinknode* pos)//任意位置刪除

dlinknode* after = pos->next;

dlinknode* before = pos->prev;

before->next = after;

after->prev = before;

destory(pos);

}void dlinklistremove(dlinknode* head,dlinktype value)//根據元素刪除鍊錶中第乙個指定元素

dlinklisterase(dlinklistfind(head,value));

}void dlinklistremoveall(dlinknode* head,dlinktype value)//根據元素刪除鍊錶中所有指定元素

dlinknode* cur = head->next;

while(cur!=head)

}size_t dlinklistsize(dlinknode* head)//鍊錶長度

size_t i = 0;

dlinknode* cur = head->next;

while(cur!= head)

return i;

}int dlinklistempty(dlinknode* head)//判斷鍊錶是否為空

if(head->next == head)

else

} 測試函式

void test_dlinklistpushback()

void test_dlinklistpopback()

void test_dlinklistpushfront()

void test_dlinklistpopfront()

void test_dlinklistfind()

void test_dlinklistinsertbefore()

void test_dlinklistinsertafter()

void test_dlinklisterase()

void test_dlinklistremove()

void test_dlinklistremoveall()

void test_dlinklistsize()

void test_dlinklistempty()

int main()        //main函式

執行結果

有頭結點的單鏈表(java實現)

class node node int data class list public void insert int data node.next tmp.next tmp.next node public void delete int data tmp tmp.next public void ...

47 有頭結點的單鏈表

typedef int elemtype typedef struct node struct node next headlist 有頭結點的單鏈表 include headlist.h include include include static headlist elemtype val,he...

判斷乙個單鏈表是否有環

一 判斷鍊錶是否存在環 設定兩個指標 fast,slow 初始值都指向頭,slow每次前進一步,fast每次前進二步,如果鍊錶存在環,則fast必定先進入 環,而slow後進入環,兩個指標必定相遇。當然,fast先行頭到尾部為null,則為無環鏈表 程式如下 bool i itsloop listn...