#include <stdio.h> #include <stdlib.h> #include <string.h> typedef struct Link { int data; struct Link *llink; struct Link *rlink; }Node,*pNode; //创建结点 pNode CreateNode(int data) { pNode p; p = (pNode)malloc(sizeof(Node)); if ( !p ) { printf("内存分配失败......"); exit(-1); } p->data = data; p->llink = p->rlink = p; //创建新结点时,让其前驱和后继指针都指向自身 return p; } //创建链表 pNode CreateList(int data) { pNode p; p = (pNode)malloc(sizeof(Node)); if ( !p ) { exit(-1); } p->data = data; p->llink = p->rlink = p; return p; } //插入新结点,总是在表尾插入; 返回表头结点 pNode InsertNode(pNode node,int data) { pNode p; p = CreateNode(data); // 从左到右恢复链接 node->llink->rlink = p; p->rlink = node; // 从右到左恢复链接 p->llink = node->llink; node->llink = p; return node; } //查找结点,成功则返回满足条件的结点指针,否则返回NULL pNode FindNode(pNode node,int data) { pNode p = node->rlink; while ( p != node && p->data != data ) { p = p->rlink; } if ( p == node ) { return NULL; } return p; } pLink DeleteNode(pLink node,int data) { pLink p = FindNode(node,data); if ( p ) { p->llink->rlink = p->rlink; p->rlink->llink = p->llink; free(p); return node; } else { return NULL; } } int GetLength(pLink node) { int count=0; pLink p = node->rlink; while ( p != node ) { p = p->rlink; count++; } return count; } void DisplayList(pLink node) { pLink p; if ( NULL == node ) { return NULL; } p = node->rlink; while ( p != node ) { printf("%4d",p->data); p = p->rlink; } printf("\n"); } void DisplayList1(pLink node) { pLink p; if ( NULL == node ) { return NULL; } p = node->llink; while ( p != node ) { printf("%4d",p->data); p = p->llink; } printf("\n"); } void DestoryList(pLink node) { pLink p,ptr; if ( NULL == node ) { return NULL; } p = node->rlink; while ( p != node ) { ptr = p->rlink; free(p); p = ptr; } free(node); } int main(void) { int choose,i; int data,n; int r,k=1,r1; pLink p; pLink list = CreateList(0); while ( k == 1 ) { printf("主菜单:\n"); printf("1. 插入元素\n"); printf("2. 删除元素\n"); printf("3. 查找元素\n"); printf("4. 链表长度\n"); printf("5. 正向打印\n"); printf("6. 逆向打印\n"); printf("7. 删除链表\n"); printf("0. 退出\n"); r = scanf("%d",&choose); flushall(); if ( r == 1 ) { switch(choose) { case 1: do{ printf("输入要插入的数字个数:"); r1 = scanf("%d",&n); flushall(); if ( r1 == 1 ) { for ( i=0 ; i<n ; i++) { do{ printf("第%d个数: ",i+1); r1 = scanf("%d",&data); flushall(); if ( r1 == 1 ) { list = InsertList(list,data); } }while ( !(r1 == 1) ); } DisplayList(list); } }while ( !( r1 == 1 ) ); printf("\n"); break; case 2: printf("输入要删除的数字:"); scanf("%d",&data); DeleteNode(list,data); DisplayList(list); printf("\n"); break; case 3: printf("输入要查找的数字:"); scanf("%d",&data); p = FindNode(list,data); if ( NULL != p ) { printf("查找成功!\n"); } else { printf("查找失败!\n"); } printf("\n"); break; case 4: printf("链表长度为:%d\n",GetLength(list)); printf("\n"); break; case 5: DisplayList(list); printf("\n"); break; case 6: DisplayList1(list); printf("\n"); break; case 7: DestoryList(list); printf("\n"); break; case 0: DestoryList(list); k = 0; break; } } } getch(); return 0; }
双向循环链表
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.