循环双链表的实现
来源:互联网 发布:linux打开3306端口 编辑:程序博客网 时间:2024/05/14 07:53
#include <iostream>using namespace std;#include<stdio.h>#include<stdlib.h>#define OK 1#define ERROR 0#define TRUE 1#define FALSE 0#include "time.h"#define MAXSIZE 1000 /* 存储空间初始分配量 */typedef int ElemType ;typedef int status ;typedef struct Node{ int data; struct Node *next; struct Node *prior;}Node,*LinkList;status initNOde(LinkList *L){ (*L) = (LinkList)malloc(sizeof(Node)); if(!(*L)) return ERROR; else{ (*L)->next = (*L); (*L)->prior = (*L); return OK; }}status isEmpty(LinkList L){ if(L->next == L || L->prior== L){ return OK; }else{ return ERROR; }}status insertHead(LinkList L,int e){ //插入第一个元素 LinkList head = (LinkList) malloc(sizeof(Node)); head->data = e; head->prior = L; head->next = L; L->next = head; L->prior = head; return OK;}status insertNode(LinkList *L,int i ,int e){ if(isEmpty((*L))) //判断当前的链表是否为空 return insertHead((*L),e); //返回是否在第一个位置插入了节点 LinkList p = (*L); int j=1; while(j<i){ //p指向的节点不是头结点 i的值大于链表的长度 p = p->next; j++; if(p==(*L)) return ERROR; } if(j>i) //处理i=0的特殊情况 return ERROR; LinkList newList = (LinkList)malloc(sizeof(Node)); newList->data = e; newList->prior = p; //当p指向最后一个位置时,判断依然是下面,不许要增加 newList->next = p->next; p->next->prior = newList; p->next = newList;}status DeleteList(LinkList *L ,int i , ElemType *e ){ if(isEmpty((*L))) return ERROR; LinkList p = (*L)->next; //这里与插入不同的是从一个节点开始遍历, //因为我们要操纵的是第i个位置 int j=1; while(j<i){ //于插入同理,找到i的位置 p = p->next; j++; if(p==(*L)) return ERROR; } if(i<j) return ERROR; p->prior->next=p->next; p->next->prior =p->prior; *e = p->data; //获取数据 free(p);}status AlwaysInsertHead(LinkList *L,int n){//头插法 srand(time(0)); (*L) = (LinkList)malloc(sizeof(Node)); (*L)->prior = (*L); (*L)->next = (*L); int i=0; LinkList p=(*L); //遍历的作用是指向新创建节点的位置 for(;i<n;i++){ LinkList head = (LinkList)malloc(sizeof(Node)); head->data = rand()%100+1; head->prior=(*L); head->next =p; p->prior=head; (*L)->next =head; p=head; }}status AlwaysInsertTail(LinkList *L,int n){//尾插法 srand(time(0)); (*L) = (LinkList)malloc(sizeof(Node)); (*L)->next=(*L); (*L)->prior=(*L); int i=0; LinkList s=(*L); //记录新创建节点的位置 for(;i<n;i++){ LinkList p = (LinkList)malloc(sizeof(Node)); p->data = rand()%100+1; p->next = (*L); //总是插到最后一个位置 p->prior = s; s->next = p; (*L)->prior = p; s = p; }}status getValue(LinkList L ,int i ,ElemType * e){ if(isEmpty(L)) return ERROR; int j=1; LinkList p = L->next; while(p!=L&&j<i){ j++; p=p->next; } if(p==L||j>i){ return ERROR; } *e = p->data; return OK;}int findEqualVaule(LinkList L ,ElemType e){ if(isEmpty(L)) return ERROR; int j=1; LinkList p = L->next; while(p!=L){ if(p->data==e) return j; j++; p=p->next; } if(p==L){ return ERROR; }}int ListLength(LinkList L){ if(isEmpty(L)) return ERROR; int j=0; LinkList p = L->next; while(p!=L){ j++; p=p->next; } return j;}status ClearList(LinkList L){ if(isEmpty(L)) return ERROR; LinkList p=L->next; LinkList q; while(p!=L){ q=p->next; free(p); p=q; } (L)->next = (L); (L)->prior = (L); return OK;}int main(){ LinkList node1 ; initNOde(&node1); //初始化node1 //开始测试插入功能 insertNode(&node1,1,2); //在第一个位置插入值为2的节点 insertNode(&node1,2,3); insertNode(&node1,3,4); insertNode(&node1,2,6); insertNode(&node1,1,7); LinkList p = node1->next; //p指向第一个节点 while(p!= node1){ printf("%d\n",p->data); p = p->next; } LinkList pr = node1->prior; while(pr !=node1){ printf("%d\n",pr->data); pr = pr->prior; } //插入功能测试完毕 /******开始测试删除功能******/ printf("\n"); int value; DeleteList(&node1,1,&value); DeleteList(&node1,1,&value); DeleteList(&node1,2,&value); printf("删除节点的数据值%d\n",value); p = node1->next; //p指向第一个节点 while(p!= node1){ printf("%d\n",p->data); p = p->next; } pr = node1->prior; while(pr !=node1){ printf("%d\n",pr->data); pr = pr->prior; }/******测试头插法功能开始******/ printf("\n"); LinkList node2; AlwaysInsertHead(&node2,10); LinkList h; h=node2->next; while(h!= node2){ printf("%d\n",h->data); h = h->next; } printf("\n"); LinkList h1; h1 = node2->prior; while(h1!=node2){ printf("%d\n",h1->data); h1 = h1->prior; }/******测试尾插法功能开始******/printf("\n"); LinkList node3; AlwaysInsertTail(&node3,3); LinkList t; t=node3->next; while(t!= node3){ printf("%d\n",t->data); t = t->next; } printf("\n"); LinkList t1; t1 = node3->prior; while(t1!=node3){ printf("%d\n",t1->data); t1 = t1->prior; }/******测试得到第i个位置的元素的值******/ printf("\n"); int result; getValue(node3,3,&result); printf("%d\n",result);/******测试查找与value相等元素的位置******/ printf("\n"); int x = findEqualVaule(node1,4); printf("%d\n",x);/******计算链表的长度******/ printf("\n"); int y = ListLength(node2); printf("%d\n",y);/*****清空链表*****/ printf("%p\n",node3); ClearList(node3); printf("%p\n",node3->next); printf("%p\n",node3->prior);return 0;}
0 0
- 循环双链表的实现
- 循环双链表的实现
- 循环双链表的C++实现
- 循环双链表的简单实现
- 循环双链表的简单实现
- 循环双链表的基本操作实现
- 循环双链表的基本操作实现
- 循环移位的实现
- 循环单链表的实现
- 实现的无缝循环
- 循环队列的实现
- 循环队列的实现
- 循环队列的实现
- 循环缓冲的实现
- 循环队列的实现
- 循环移位的实现
- 循环队列的实现
- 循环队列的实现
- 关于oracle中 != 及 null 使用注意点
- (14)标准库类型vector
- 93. Restore IP Addresses
- 音频信号特征提取(1):短时特征之短时能量、短时功率、短时过零率
- 性能优化篇---内存管理之Android内存泄露
- 循环双链表的实现
- 事件(一)
- mysql identified怎么用
- 网易视频云:专注于技术服务——异步通知系统
- 《黑客与画家读后感》
- WTL的窗口子类化与超类化
- 网易视频云:专注于技术服务——异步通知系统
- linux挂在NAS 文件名乱码
- Android 使用DisplayImageOptions加载头像 自定义圆形头像