//帶哨兵的雙向鏈表
#include<stdio.h>
#include<stdlib.h>
typedef struct NODE{
struct NODE*prev;char key;struct NODE*next;
}NODE;
NODE*NIL=NULL;//雙鏈表L的哨兵結點。
NODE*search(char key)//每次循環省略對p!=NULL的檢查
{/*查找雙鏈表L中第一個關鍵字爲key的元素,並返回指向該元素的指針,
不存在key則返回NULL。*/
NODE*p=NIL->next;NIL->key=key;
while(p->key!=key) p=p->next;
if(p==NIL) {puts("This node doesn't exist.");return NULL;}
else return p;
}
void insert(NODE*p)//將p插入到L首端
{
NIL->next->prev=p;
p->next=NIL->next;
NIL->next=p;
p->prev=NIL;
}
void delete(NODE*p)//刪除L中p指向的元素
{
if(!p) return;
p->prev->next=p->next;
p->next->prev=p->prev;
free(p);
}
NODE* createnode(char key)
{
NODE*p=(NODE*)malloc(sizeof(NODE));
if(!p){
puts("memory exhausted.");exit(1);
}
p->key=key;
return p;
}
void traverse()
{
NODE*p;
for(p=NIL->next;p!=NIL;p=p->next)
putchar(p->key);
putchar(' ');putchar(' ');
for(p=NIL->prev;p!=NIL;p=p->prev)
putchar(p->key);
putchar('\n');
}
int main(void)
{
//創建一個空鏈表
NIL=createnode(('#'));
NIL->next=NIL->prev=NIL;
traverse();
insert(createnode('a'));
insert(createnode('b'));
insert(createnode('c'));
traverse();
delete(search('a'));
traverse();
insert(createnode('d'));
insert(createnode('e'));
insert(createnode('f'));
traverse();
delete(search('1'));
delete(search('d'));
traverse();
delete(search('f'));
traverse();
delete(search('b'));
delete(search('c'));
traverse();
delete(search('e'));
delete(search('e'));
traverse();
return 0;
}
帶哨兵的雙向鏈表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.