带头节点的循环链表,循环链表的尾节点指向头节点
头文件clist.h
#pragma once //带头节点的循环链表 //循环链表的尾节点指向头节点 typedef struct CNode { int data;//数据域 struct CNode *next;//指向下一个节点的地址 }CNode,*CList; void InitList(CList plist); //头插 bool Insert_head(CList plist,int val); //尾插 bool Insert_tail(CList plist,int val); bool IsEmpty(CList plist); bool Delete(CList plist,int key); CNode * Search(CList plist,int key);//CList void Show(CList plist); void Destroy(CList plist); void Clear(CList plist); //获取有效数据的个数 int GetLength(CList plist); //链表逆置 void Reverse(CList plist);
实现功能 clist.cpp 文件
#include <stdio.h> #include <stdlib.h> #include <assert.h> #include "clist.h" //头节点的next指向自己 void InitList(CList plist) { assert(plist != NULL); if(plist == NULL) { return; } plist->next = plist; } //头插 bool Insert_head(CList plist,int val) { CNode *p = (CNode *)malloc(sizeof(CNode)); p->data = val; p->next = plist->next; plist->next = p; return true; } //尾插 bool Insert_tail(CList plist,int val) { CNode *p; for(p=plist;p->next!=plist;p=p->next) ; CNode *q = (CNode *)malloc(sizeof(CNode)); q->data = val; //将q插入在p的后面 q->next = p->next;//q->next = plist; p->next = q; return true; } bool IsEmpty(CList plist) { return plist->next == plist; } static CNode *SearchPri(CList plist,int key) { for(CNode *p=plist;p->next!=plist;p=p->next) { if(p->next->data == key) { return p; } } return NULL; } bool Delete(CList plist,int key) { CNode *p = SearchPri(plist,key); if(p == NULL) { return false; } CNode *q = p->next; p->next = q->next; free(q); return true; } CNode * Search(CList plist,int key)//CList { for(CNode *p=plist->next;p!=plist;p=p->next) { if(p->data == key) { return p; } } return NULL; } void Show(CList plist) { for(CNode *p=plist->next;p!=plist;p=p->next) { printf("%d ",p->data); } printf("\n"); } void Destroy(CList plist) { CNode *p; while(plist->next != plist) { p = plist->next; plist->next = p->next; free(p); } } void Clear(CList plist) { Destroy(plist); } //获取有效数据的个数 int GetLength(CList plist) { int count = 0; for(CNode *p=plist->next;p!=plist;p=p->next) { count++; } return count; } //链表逆置 void Reverse(CList plist) { CNode *p = plist->next; CNode *q ; plist->next = plist;//**** while(p != plist) { q = p->next; //将p利用头插的方法插入到链表中 p->next = plist->next; plist->next = p; p = q; } }
测试test.cpp文件
int main() { CNode n; InitList(&n); for(int i=0;i<=10;i++) { Insert_head(&n,i); } Show(&n); Delete(&n,10); Show(&n); Reverse(&n); Show(&n); }
最终运行结果: