带哨兵的双向链表

来源:互联网 发布:linux shell执行exe 编辑:程序博客网 时间:2024/06/05 05:32
//带哨兵的双向链表#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;}

0 0
原创粉丝点击