循环单链表
来源:互联网 发布:数据恢复装系统 编辑:程序博客网 时间:2024/06/07 03:04
循环单链表是单链表的另一种形式,其结构特点链表中最后一个结点的指针域不再是结束标记,而是指向整个链表的第一个结点,从而使链表形成一个环。
形态:
1,链表为空时:
2,链表非空时:
/*********************************************** 循环单链表的实现 by Rowandjj date 2014.4.1***********************************************/#include<IOSTREAM>using namespace std;#define OVERFLOW -1typedef int ElemType;typedef struct _NODE_{ ElemType e; struct _NODE_ *next;}Node,*pNode,*LinkList_C;/*操作声明*/void InitList(LinkList_C &L);void DestroyList(LinkList_C &L);int ListEmpty(LinkList_C L);int ListLength(LinkList_C L);void PrintList(LinkList_C L);int GetElem(LinkList_C L,int n,ElemType &e);int LocateElem(LinkList_C L,ElemType e);int ListInsert(LinkList_C &L,int n,ElemType e);int ListDelete(LinkList_C &L,int n,ElemType &e);void CreateList(LinkList_C &L,int n);/*****************************************************//*具体实现细节*/void InitList(LinkList_C &L){ L = (pNode)malloc(sizeof(Node)); if(!L) { exit(OVERFLOW); } L->next = L;}void CreateList(LinkList_C &L,int n){ ElemType e; if(n <= 0) { return; } for(int i = 0; i < n; i++) { pNode p = (pNode)malloc(sizeof(Node)); if(!p) { exit(OVERFLOW); } cin>>e; p->e = e; p->next = L->next; L->next = p; }}int ListDelete(LinkList_C &L,int n,ElemType &e){ pNode p = L,q; int i = 0; if(p->next == L || n <= 0) { return 0; } if(n == 1) { q = p->next; e = q->e; p->next = q->next; free(q); return 1; } p = p->next; while(p!=L && i<n-2) { i++; p = p->next; } if(p == L) { return 0; } if(p->next == L)//注意这里加了一个判断,否则当要删除的位置为链表长度时+1时会报错 { return 0; } q = p->next; p->next = q->next; e = q->e; free(q); return 1;}int ListInsert(LinkList_C &L,int n,ElemType e){ pNode p = L,q; int i = 0; if(n<= 0) { return 0; } if(p->next == L || n == 1) { q = (pNode)malloc(sizeof(Node)); if(!q) { exit(OVERFLOW); } q->e = e; q->next = p->next; p->next = q; return 1; } else { p = p->next; while(p != L && i < n-2) { p = p->next; i++; } if(p == L) { return 0; } q = (pNode)malloc(sizeof(Node)); if(!q) { exit(OVERFLOW); } q->next = p->next; p->next = q; q->e = e; return 1; }}int LocateElem(LinkList_C L,ElemType e){ pNode p = L->next; int i = 1; if(p == L) { return -1; } while(p!=L && p->e != e) { p = p->next; i++; } if(p == L) { return -1; } return i;}int GetElem(LinkList_C L,int n,ElemType &e){ // 1<=n<=list_size pNode p = L->next; int i = 0; if(p == L) { return 0; } if(n == 1) { e = p->e; return 1; } while(p!=L && i < n-1) { i++; p = p->next; } if(p == L) { return 0; } e = p->e; return 1;}void PrintList(LinkList_C L){ pNode p = L->next; while(p!=L) { cout<<p->e<<" "; p = p->next; } cout<<endl;}int ListLength(LinkList_C L){ pNode p = L->next; int i = 0; if(p == L) { return 0; } while(p!=L) { i++; p = p->next; } return i;}int ListEmpty(LinkList_C L){ return L->next == L;}void DestroyList(LinkList_C &L){ pNode p,q = L->next; while(q != L) { p = q->next; free(q); q = p; } free(L); L = NULL;}
1 0
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表
- 循环单链表-两个循环单链表连接
- 循环单链表的实现
- 循环单链表的建立
- 循环单链表(circular list)
- 多线程经典案例——生产者/消费者问题的Java实现与详解
- 对象作为数据成员
- 每天一个小程序(16)——交换排序之快速排序2
- 一步步学习微软InfoPath2010和SP2010--第九章节--使用SharePoint用户配置文件Web service
- 1048:字符串反转
- 循环单链表
- 表单提交时报错:No result defined for action com.ylj.action.BbsAction and result input
- 自动批量修改密码
- 浅谈外包与合伙
- 简单的ajax用法
- 管理飞扬跋扈的技术部
- 网易游戏TTT计划实习生笔试题
- HDU解题报告——1041
- 菜鸟日记1(Vim基础命令)