数据结构-循环双链表
循环链表,就是把链表给首尾相连,即尾结点的next指向L头结点,而循环双链表不仅尾结点指向头结点,且头结点的prior指向尾结点,判断为空时,只要看尾结点下一个是否指向头结点,循环链表的操作和链表的操作差别并不大。
循环双链表的创建、插入、删除
#include<iostream> #include<cstdlib> using namespace std; typedef int ElemType; typedef struct CNode{ ElemType data; struct CNode *next; struct CNode *prior; }CNode,*CLinkNode; void createCLinkNode(CLinkNode &L){ L = (CNode*)malloc(sizeof(CNode)); CLinkNode t,s; t=L; ElemType e; cin>>e; while(e!=-1){ s=(CLinkNode)malloc(sizeof(CNode)); s->data = e; t->next = s; s->prior = t; t = s; cin>>e; } t->next = L; // L->prior = t; } void print(CLinkNode L){ CLinkNode p = L -> next; while(p!=L){ cout<<p->data<<" "; p=p->next; } cout<<endl; p=L->prior; while(p!=L){ cout<<p->data<<" "; p=p->prior; } cout<<endl; } CLinkNode get(CLinkNode L,int i){ CLinkNode p = L; int j = 1; while(p&&j<i){ p=p->next; j++; } return p; } void insertCLinkNode(CLinkNode &L,int i){ ///插入到第一个 结点之前 CLinkNode p = get(L,i); CLinkNode s = (CLinkNode)malloc(sizeof(CNode)); s->data = 999; s->next = p->next; //s的下一个节点,是原p的下一个结点 p->next->prior = s; //原p的下一个结点的前一个结点变为s s->prior = p; //s的前一个结点是p p->next = s; } void deleteCLinkNode(CLinkNode &L,int i){ //删除第一个结点 CLinkNode p = get(L,i); CLinkNode q = p->next; p->next = q->next; q->next->prior = p; } int main() { CLinkNode L; createCLinkNode(L); print(L); insertCLinkNode(L,1); print(L); deleteCLinkNode(L,1); print(L); return 0; }
如有错误,敬请指正!
下一篇:
Java设计模式-02工厂模式