帶哨兵的雙向鏈表

//帶哨兵的雙向鏈表
#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;
}

發佈了47 篇原創文章 · 獲贊 4 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章