单向循环链表的基本操作

来源:互联网 发布:java是做什么的 编辑:程序博客网 时间:2024/04/28 01:35
单向循环链表的基本操作



1、头文件(clist.h)
#pragma once//循环链表typedef struct CNode{int data;struct CNode *next;}CNode,*CList;//循环链表初始化void InitList(CList plist);//头插bool Insert_head(CList plist,int key);//尾插bool Insert_tail(CList plist,int key);//查找CNode *Search(CList plist,int key);//删除bool Delete(CList plist,int key);//获取循环链表长度(数据结点的个数)int GetLength(CList plist);//判空bool IsEmpty(CList plist);//清空void Clear(CList plist);//摧毁void Destroy(CList plist);//打印循环链表void Show(CList plist);

2、源文件(clist.cpp)
#include<stdio.h>#include<stdlib.h>#include<assert.h>#include"clist.h"//循环链表初始化void InitList(CList plist){assert(plist != NULL);if(plist == NULL){return ;}plist->next = plist;}//头插bool Insert_head(CList plist,int val){assert(plist != NULL);if(plist == NULL){return false;}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){assert(plist != NULL);if(plist == NULL){return false;}CNode *p = (CNode *)malloc(sizeof(CNode));p->data = val;CNode *q;for(q = plist;q->next != plist;q = q->next);//找尾巴//将p插在q的后面q->next = p;p->next = plist;return true;}//查找CNode *Search(CList plist,int key){assert(plist != NULL);if(plist == NULL){return false;}for(CNode *p = plist->next;p != plist;p = p->next){if(p->data == key){return p;}}return NULL;}//查找前驱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){assert(plist != NULL);if(plist == NULL){return false;}CNode *p = SearchPri(plist,key);if(p == NULL){return false;}CNode *q = p->next;p->next = q->next;free(q);return true;}//获取循环链表长度(数据结点的个数)int GetLength(CList plist){int count = 0;for(CNode *p = plist->next;p != plist;p = p->next)//遍历所有结点{count++;}return count;}//判空bool IsEmpty(CList plist){return plist->next == plist;}//清空void Clear(CList plist){Destroy(plist);}//摧毁void Destroy(CList plist){CNode *p;while(plist->next != plist){p = plist->next;plist->next = p->next;free(p);}}//打印循环链表void Show(CList plist){for(CNode *p = plist->next;p != plist;p = p->next){printf("%d ",p->data);}printf("\n");}


3、测试源文件(test.cpp)
#include<stdio.h>#include<vld.h>//测试内存是否泄露#include"clist.h"int main(){CNode head1;CNode head2;//测试初始化InitList(&head1);InitList(&head2);for(int i = 0;i < 15;i++){Insert_head(&head1,i);Insert_tail(&head2,i);}Show(&head1);Show(&head2);//测试删除Delete(&head2,6);Show(&head2);//测试获取单向循环链表的长度printf("%d\n",GetLength(&head1));//测试摧毁Destroy(&head1);Destroy(&head1);return 0;}








原创粉丝点击