数据结构——双向循环链表——2016_11_14
双向循环链表源代码(C语言版)
/*********实现了,插入,删除,顺逆序打印*********/
#include<stdio.h> #include<stdlib.h> //定义节点结构体 typedef struct DuLNode{ int data; struct DuLNode * prior; struct DuLNode * next; }DuLNode,*DuLinkList; //初始化循环双向链表; void InitDuLNode(DuLinkList L){ L->next=L; L->prior=L; } //建造双向循环链表 void BuildDuLNode(DuLinkList L,int c){ DuLinkList p,s; int i=1; p=L; while(c--){ s=(DuLinkList)malloc(sizeof(DuLNode)); while(p->next!=L){ p=p->next; } s->next=p->next; p->next=s; L->prior=s; //此处要引用头指针L,必须连接在最后节点s上面,才可实现循环,不然逆序打印会出问题。 s->prior=p; s->data=i; i++; } } //确定插入位置,符合则返回指针 DuLinkList GetDuLink(DuLinkList L,int i){ DuLinkList p; int j=0; p=L; while(p->next!=L&&j<i){ p=p->next; j++; } if(!p || i>j){ printf("插入位置错误\n"); //exit(0); } return p; } //插入节点 void InsertDuLNode(DuLinkList L,int i,int e){ DuLinkList p,s; if(!(p=GetDuLink(L,i))) {printf("1\n"); exit(0);} if(!(s=(DuLinkList)malloc(sizeof(DuLNode)))) { printf("2\n"); exit(0);} s->prior=p->prior; //给指针赋值的时候注意指向,我就把s->prior=p->prior写成p->prior=s->prior,整了好半天。 p->prior->next=s; s->next=p; p->prior=s; s->data=e; } //删除节点 void DeleteDuLNode(DuLinkList L,int i){ DuLinkList p; if(!(p=GetDuLink(L,i))) exit(0); p->prior->next=p->next; p->next->prior=p->prior; free(p); } //顺序打印双向循环链表 void YPrintDuLNode(DuLinkList L){ DuLinkList p; p=L; while(p->next!=L){ p=p->next; printf("%d ",p->data); } printf("\n"); } //逆序打印双向循环链表 void NPrintDuLNode(DuLinkList L){ DuLinkList p; p=L; while(p->prior!=L){ p=p->prior; printf("%d ",p->data); } printf("\n"); } //主函数 int main(){ DuLNode M; int x,w,v,k; InitDuLNode(&M); BuildDuLNode(&M,12); printf("十二个数字的双向循环链表已经建立:\n"); YPrintDuLNode(&M); printf("\n\n\n"); while(1){ printf("请输入序号进行操作:1、插入 2、删除 3、退出\n"); scanf("%d",&x); switch(x){ case 1: printf("请输入要插入的位置和数值:\n"); scanf("%d %d",&w,&v); InsertDuLNode(&M,w,v); YPrintDuLNode(&M);//顺序打印 break; case 2: printf("请输入要删除的位置:\n"); scanf("%d",&w); DeleteDuLNode(&M,w); NPrintDuLNode(&M);//逆序打印 break; case 3: exit(0); break; default: printf("输入有误,请重新输入!\n"); } } return 0; }
————程序运行截图————
2016_11_14