双向循环链表程序
//dblist.h #include <stdio.h> #include <stdlib.h> typedef struct tagDbNode { int data; struct tagDbNode * left; struct tagDbNode * right; } DbNode, * pdbNode; //创建结点 pdbNode CreateNode(int data) { pdbNode pnode = (pdbNode)malloc(sizeof(DbNode)); pnode->data = data; pnode->left = pnode->right = pnode; //创建新结点时,让其前驱和后继指针都指向自身 return pnode; } //创建链表 pdbNode CreateList(int head) //参数给出表头结点数据 (表头结点不作为存放有意义数据的结点) { pdbNode pnode = (pdbNode)malloc(sizeof(DbNode)); pnode->data = head; pnode->left = pnode->right = pnode; return pnode; } //插入新结点,总是在表尾插入; 返回表头结点 pdbNode InsertNode(pdbNode node, int data) // 参数1是链表的表头结点,参数2是要插入的结点(结 点数据为data) { pdbNode pnode = CreateNode(data); // 从左到右恢复链接 node->left->right = pnode; pnode->right = node; // 从右到左恢复链接 pnode->left = node->left; node->left = pnode; return node; } //查找结点,成功则返回满足条件的结点指针,否则返回NULL pdbNode FindNode(pdbNode node, int data) // 参数1是链表的表头结点,参数2是要查找的结点(其中 结点数据为data) { pdbNode pnode = node->right; while (pnode != node && pnode->data != data) { pnode = pnode->right; } if (pnode == node) return NULL; return pnode; } //删除满足指定条件的结点, 返回表头结点, 删除失败返回NULL(失败的原因是不存在该结点) pdbNode DeleteNode(pdbNode node, int data) // 参数1是链表的表头结点,参数2是要删除的结点(其 中结点数据为data) { pdbNode pnode = FindNode(node, data); if (NULL == pnode) return NULL; pnode->left->right=pnode->right; pnode->right->left=pnode->left; free(pnode); return node; } //获取链表的长度 int GetLength(pdbNode node) // 参数为链表的表头结点 { int nCount = 0; pdbNode pnode = node->right; while (pnode!= node) { pnode = pnode->right; nCount++; } return nCount; } //顺序打印整个链表 void PrintList(pdbNode node) // 参数为链表的表头结点 { pdbNode pnode; if (NULL == node) return; pnode= node->right; while (pnode != node) { printf("%d ", pnode->data); pnode = pnode ->right; } printf("\n"); } //将链表反序打印 void ReverPrint(pdbNode node) //参数为链表的表头结点 { pdbNode pnode; if (NULL == node) return; pnode= node->left; while (pnode != node) { printf("%d ", pnode->data); pnode = pnode->left; } printf("\n"); } //删除链表 void DeleteList(pdbNode node) //参数为链表表头结点 { pdbNode pnode = node->right; pdbNode ptmp; if (NULL == node) return; while (pnode != node) { ptmp = pnode->right; free(pnode); pnode = ptmp; } free(node); } //测试程序 #include <stdio.h> #include <stdlib.h> #include "dblist.h" #define FALSE 0 #define TRUE 1 typedef unsigned int bool; void main() { int nChoose; int data; bool bFlag = FALSE; pdbNode pnode; pdbNode list = CreateList(0); while(bFlag == FALSE) { printf("Main Menu\n"); printf("1. Insert\n"); printf("2. Delete Node\n"); printf("3. Find\n"); printf("4. Length\n"); printf("5. Positive Print\n"); printf("6. Negative Print\n"); printf("7. Delete List\n"); printf("0. quit\n\n"); scanf("%d", &nChoose); switch(nChoose) { case 1: printf("Input the data to insert:"); scanf("%d", &data); list = InsertNode(list, data); PrintList(list); printf("\n"); break; case 2: printf("Input the data to delete: "); scanf("%d", &data); DeleteNode(list, data); PrintList(list); printf("\n"); break; case 3: printf("Input the data to find: "); scanf("%d", &data); pnode = FindNode(list, data); if (NULL != pnode) { printf("Find succeed!\n"); printf("\n"); } else { printf("Find failed!\n"); printf("\n"); } break; case 4: printf("The list's length is %d\n", GetLength(list)); printf("\n"); break; case 5: PrintList(list); printf("\n"); break; case 6: ReverPrint(list); printf("\n"); break; case 7: DeleteList(list); printf("\n"); break; case 0: DeleteList(list); bFlag = TRUE; } } }