实现单向循环链表的创建、测长、打印、插入、删除及逆置
2016-07-27 14:57
645 查看
实例实现单向循环链表的创建、测长、打印、插入、删除及逆置
//circularList.h文件
#ifndef CIRCULAR_H_H_H
#define CIRCULAR_H_H_H
typedef struct student
{
int data;
struct student *next;
}cnode;
typedef cnode * cirList;
typedef cnode * cirPosition;
//建立循环链表
cirList CirCreate();
//循环链表测长
int CirLength (cirList L);
//循环链表打印
void CirPrint(cirList L);
//循环链表删除结点
cirList CirDelete(cirList L, int num);
//循环链表在值为val的结点前插入结点,值为insertvalue
cirList CirInsert(cirList L, int val, int insertvalue);
//循环链表的逆置
cirList CirReverse(cirList &L);
#endif
//circularList.h文件
#ifndef CIRCULAR_H_H_H
#define CIRCULAR_H_H_H
typedef struct student
{
int data;
struct student *next;
}cnode;
typedef cnode * cirList;
typedef cnode * cirPosition;
//建立循环链表
cirList CirCreate();
//循环链表测长
int CirLength (cirList L);
//循环链表打印
void CirPrint(cirList L);
//循环链表删除结点
cirList CirDelete(cirList L, int num);
//循环链表在值为val的结点前插入结点,值为insertvalue
cirList CirInsert(cirList L, int val, int insertvalue);
//循环链表的逆置
cirList CirReverse(cirList &L);
#endif
//circularList.cpp源文件 #include <iostream> #include <stdio.h> #include <string> #include <conio.h> using namespace std; #include "circularList.h" /************************************************************************/ /* 功能:编程实现一个循环链表的建立(只有头指针,没有头结点) */ /* 参数:无 */ /* 返回:链表的头指针 */ /************************************************************************/ cirList CirCreate() { cirList head,p,s; //head用于实现指向头结点,p指向当前结点,s指向新创建结点,p、s实现循环创建 int x,cycle = 1; head = (cirList)malloc(sizeof(cnode)); //这个结点是个没用的结点,后面应该释放掉 p = head; while(cycle) { printf("\nPlease input the data: "); scanf("%d",&x); if(x != 0) { s = (cirList)malloc(sizeof(cnode)); s->data = x; printf("\n %d",s->data); p->next = s; p = s; } else cycle = 0; } head = head->next; p->next = head; return head; } /************************************************************************/ /* 功能:编程实现一个循环链表的测长(只有头指针,没有头结点) */ /* 参数:链表的头指针 */ /* 返回:循环链表的长度(结点数目) */ /************************************************************************/ int CirLength( cirList L ) { cirList p; int n = 0; p = L; while(p) { n++; p = p->next; if(p == L) break; } return n; } /************************************************************************/ /* 功能:编程实现一个循环链表的打印 */ /* 参数:双链表的头指针 */ /* 返回:无 */ /************************************************************************/ void CirPrint( cirList L ) { cirList p; int n = CirLength(L); printf("\nNow,These %d Records are ",n); p = L; while(p) { printf("\n %d \n",p->data); p = p->next; if(p == L) //说明已循环一周 break; } } /************************************************************************/ /* 功能:编程实现一个循环链表的删除 */ /* 参数:L:双链表的头指针 num:删除该值多对应的结点 */ /* 返回:双链表的头指针 */ /************************************************************************/ cirList CirDelete( cirList L, int num ) { cirList p,temp; p = temp = L; while(p) //头指针不为NULL { if(p->data == num) { while(temp->next != p) temp = temp->next; //找到p的上一个结点 temp->next = p->next; //删除p元素 free(p); //释放p所指的内存空间 if(p == L) //虽然p所指的内存被释放,但是其指针任指向这里,因此无影响 { return temp->next; //当删除的是头结点 } return L; } p = p->next; if(p == L) //说明已循环了一周 { printf("\n%d could not been found \n",num); break; } } return L; } /****************************************************************************************/ /* 功能:编程实现循环链表在值为val的结点前插入结点,值为insertvalue */ /* 参数:L:循环链表的头指针 val:插入的位置 insertvalue:插入的值 */ /* 返回:循环链表的头指针 */ /****************************************************************************************/ cirList CirInsert( cirList L, int val, int insertvalue ) { cirList p1,p2,p3; p1 = p2 = L; while(p1) { if(p1->data == val) { while(p2->next != p1) p2 = p2->next; p3 = (cirList)malloc(sizeof(cnode)); p3->data = insertvalue; p3->next = p2->next; p2->next = p3; if(p1 == L) //如果插入的是第一个结点 return p3; return L; } p1 = p1->next; if(p1 == L) //循环链表循环了一圈没有找到 { printf("\nNo such value can be insert\n"); break; } } return L; } /********************************************************************/ /* 功能:编程实现循环链表的逆置 */ /* 参数:L:循环链表的头指针 */ /* 返回:循环链表的头指针 */ /********************************************************************/ cirList CirReverse( cirList &L ) { cirList Pre = L; cirList Cur = L->next; cirList Next; while(Cur) { Next = Cur->next; Cur->next = Pre; Pre = Cur; Cur = Next; if(Cur == L) break; } L->next = Pre; L = Pre; return L; } int main() { cirList L; L = CirCreate(); CirPrint(L); CirDelete(L,5); CirPrint(L); CirInsert(L,4,10); CirPrint(L); CirReverse(L); CirPrint(L); return 0; }
相关文章推荐
- 用string.Join与List<T>或者与string数组转换为字符串
- 变量声明和初始化
- Inno Setup入门(五)——添加readme文件
- Python 第三方模块安装出现的问题和解决方案.
- 收集的maven 仓库地址(maven repository)
- 冒泡排序
- ibatis 使用入门
- 笔记︱横截面回归模型中调节效应+中介效应(横截面回归模型两大方向)
- HDU 5735 Born Slippy (分块+树上可持久化)
- kmp算法
- 在方法和作用域内的内部类
- 安卓版本更新的简单Demo
- 【POJ】2253 - Frogger(二分)
- Android:adb 启动activity、service,发送broadcast
- Android碎碎念 -- 组件化、模块化、插件化
- sewise发布HTML5开源播放器框架
- VS2010中,无法嵌入互操作类型“……”,请改用适用的接口的解决方法
- Inno Setup入门(六)——在程序目录下创建文件夹
- jquery学习以及下载链接
- Hrbust 1795 发现王国之旅【MST】