不帶哨兵的雙向鏈表

//不帶哨兵的雙向鏈表
#include<stdio.h>
#include<stdlib.h>
typedef struct NODE{
    struct NODE*prev;char key;struct NODE*next;
}NODE;
NODE*L=NULL;//雙鏈表L的表頭
NODE*search(char key)
{/*查找雙鏈表L中第一個關鍵字爲key的元素,並返回指向該元素的指針,
不存在key則返回NULL。*/
    NODE*p=L;
    while(p&&p->key!=key) p=p->next;
    if(!p) puts("This node doesn't exist.");
    return p;
}
void insert(NODE*p)//將p插入到L首端
{
    p->next=L;
    if(L) L->prev=p;
    L=p;p->prev=NULL;
}
void delete(NODE*p)//刪除L中p指向的元素
{
    if(!p) return;
    if(p->prev) p->prev->next=p->next;
    else L=p->next;
    if(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=L;p;p=p->next)
        putchar(p->key);
    putchar(' ');putchar(' ');
    p=L;
    if(p){
        while(p->next) p=p->next;
        for(;p;p=p->prev)
            putchar(p->key);
    }
    putchar('\n');
}
int main(void)
{
    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萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章