您的位置:首页 > 其它

10.2-5 带哨兵的单向循环链表

2015-08-15 15:53 447 查看
//带哨兵的单向循环链表。NIL的next是头结点,尾结点的next是NIL
#include<stdio.h>
#include<stdlib.h>
typedef struct NODE{
char key;struct NODE* next;
}NODE;
NODE *NIL=NULL;
void insert(NODE* p)
{//插入到头结点
p->next=NIL->next;
NIL->next=p;
}
void delete(NODE* p)
{//删除p结点,若p不在链表中,会死循环
NODE* pre=NIL;
while(pre->next!=p){pre=pre->next;}
pre->next=p->next;free(p);
}
NODE* search(char key)
{
NODE*p=NIL->next;NIL->key=key;
while(p->key!=key) p=p->next;
return p==NIL?NULL: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('\n');
}
int main(void)
{
//初始化NIL链表
NIL=createnode('?');NIL->next=NIL;

traverse();
NODE*p=search('a');
if(p) putchar(p->key);
insert(createnode('z'));
insert(createnode('a'));
p=search('a');
if(p) putchar(p->key);
insert(createnode('b'));
traverse();
delete(search('a'));
delete(search('z'));
delete(search('b'));
traverse();
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法导论