双循环链表(包含头指针与尾指针)
来源:互联网 发布:磁力链接解析源码 编辑:程序博客网 时间:2024/05/26 19:15
双循环链表(包含头指针与尾指针)
以及基本功能的实现
list_ d_link_c.h
#ifndef _LIST_D_LINK_C_#define _LIST_D_LINK_C_#include<iostream>#include<assert.h>using namespace std;#define ElemType int typedef struct Node{ElemType data;struct Node *prio;struct Node *next;}Node,*PNode;typedef struct List{PNode first;PNode last;size_t size;}List;void Initlist(List *list);void push_back(List *list,ElemType x);void push_front(List *list,ElemType x);bool pop_back(List *list);bool pop_front(List *list);void show_seqlist(List *list);bool delete_val(List *list,ElemType key);int length(List *list);Node* find(List *list,ElemType key);void clear(List *list);void destroy(List *list);bool next(List *list,ElemType key);bool prio(List *list,ElemType key);bool resver(List *list);bool sort(List *list);//升序bool modify(List *list,ElemType key);bool insert_val(List *list,ElemType key);#endif //_LIST_D_LINK_C_
list_ d_link_c.cpp
#include"Seqlist_ d_link_c.h"void Initlist(List *list){Node *s = (Node *)malloc(sizeof(Node));assert(s != NULL);list->first = list->last = s;list->last->next = list->first;list->first->prio = list->last;list->size = 0;}void push_back(List *list,ElemType x){Node *p = (Node *)malloc(sizeof(Node));assert(p != NULL);p->data = x;p->next = list->first;list->first->prio = p;list->last->next = p;p->prio = list->last;list->last = p;list->size++;}void push_front(List *list,ElemType x){Node *p = (Node *)malloc(sizeof(Node));assert(p != NULL);p->data = x;if(list->size == 0){list->last = p;}p->next = list->first->next;p->prio = list->first;list->first->next = p;list->size++;}bool pop_back(List *list){Node *p = list->last;if(list->size == 0){cout<<"list is NULL!"<<endl;return false;}if(list->size == 1){list->last = list->first;}p->prio->next = list->first;list->first->prio = p->prio;free(p);list->last = list->first->prio;list->size--;return true;}bool pop_front(List *list){Node *p = list->first->next;if(list->size ==0){cout<<"the list is null!"<<endl;return false;}if(list->size == 1){list->last = list->first;//list->last->next = list->first;}list->first->next = p->next;p->next->prio = list->first;free(p);list->size--;return true;}void show_seqlist(List *list){Node *p = list->first->next;while(p!= list->first){cout<<p->data<<"-->";p = p->next;}cout<<"Nul"<<endl;}int length(List *list){return list->size;}Node* find(List *list,ElemType key){Node *p = list->first->next;while(p != list->first && p->data != key)p = p->next;if(p == list->first)return NULL;return p;}void clear(List *list){Node *p = list->first->next;while(p != list->first){list->first->next = p->next;free(p);p = list->first->next;}list->last = list->first;list->size = 0;}void destroy(List *list){clear(list);free(list->first);list->first = list->last = NULL;}bool next(List *list,ElemType key){Node *p = find(list,key);if(p == NULL)return false;else if(p == list->last)cout<<key<<"'s next is "<<list->first->next->data<<endl;elsecout<<key<<"'s next is "<<p->next->data<<endl;return true;}bool prio(List *list,ElemType key){Node *p = find(list,key);if(p == NULL)return false;else if(p == list->first->next)cout<<key<<"'s prio is "<<list->last->data<<endl;elsecout<<key<<"'s prio is "<<p->prio->data<<endl;return true;}bool delete_val(List *list,ElemType key){Node *p = find(list,key);if(p == NULL)return false;p->prio->next = p->next;p->next->prio = p->prio;if(p == list->last)list->last = p->prio;free(p);list->size--;return true;}bool resver(List *list){Node *p = list->first->next;Node *q = p->next;p->next = list->first;list->first->prio = p;list->last = p;if(list->size <= 1)return false;while(q != list->first){p = q;q = q->next;p->next = list->first->next;p->prio = list->first;list->first->next = p;p->next->prio = p;}return true;}bool sort(List *list)//升序{Node *p = list->first->next;Node *q = p->next;p->next = list->first;list->first->prio = p;list->last = p;if(list->size <= 1)return false;list->size = 1;//设定初始长度为1while(q != list->first){p = q;q = q->next;insert_val(list,p->data);free(p);}return true;}bool modify(List *list,ElemType key){Node *p = find(list,key);if(p == NULL)return false;cout<<"please input a new item:"; cin>>key; p->data = key;return true;}bool insert_val(List *list,ElemType key){Node *p = find(list,key);if(p != NULL)return false;Node *q = (Node *)malloc(sizeof(Node));q->data = key;p = list->first;while(p != list->last) { if(p->next->data > key) break; else p = p->next; }q->next = p->next;p->next->prio = q;q->prio = p;p->next = q;if(p == list->last)list->last = q;list->size++;return true;}
main.cpp(测试)
#include"Seqlist_ d_link_c.h"void main (void){List mylist;Initlist(&mylist);int select = 1;int item;while(select){cout<<"***********************************"<<endl;cout<<"* [1] push_back [2] push_front *"<<endl;cout<<"* [3] show_seqlist[0] quit_system *"<<endl;cout<<"* [4] pop_back [5] pop_front *"<<endl;cout<<"* [6] delete_val [7] insert_val *"<<endl;cout<<"* [08] modify [09]clear *"<<endl;cout<<"* [10] destroy [11]sort *"<<endl;cout<<"* [12] resver [13]length *"<<endl;cout<<"* [14] next [15]prio *"<<endl;cout<<"***********************************"<<endl;cout<<"请选择:";cin>>select;switch(select){case 1:cout<<"请输入要插入的数据(-1结束):>";while(cin>>item,item!=-1){push_back(&mylist,item);}break;case 2:cout<<"请输入要插入的数据(-1结束):>";while(cin>>item,item!=-1){push_front(&mylist,item);}break;case 3:show_seqlist(&mylist);break;case 4:pop_back(&mylist);break;case 5:pop_front(&mylist);break;case 6:cout<<"please input a value:";cin>>item;delete_val(&mylist,item);break;case 7:cout<<"please input a value:";cin>>item;insert_val(&mylist,item);break;case 8:cout<<"please input a value:";cin>>item;modify(&mylist,item);break;case 9:clear(&mylist);break;case 10:destroy(&mylist);select = 0;break;case 11:sort(&mylist);break;case 12:resver(&mylist);break;case 13:cout<<"length is "<<length(&mylist)<<endl;break;case 14:cout<<"please input a value:";cin>>item;next(&mylist,item);break;case 15:cout<<"please input a value:";cin>>item;prio(&mylist,item);break;default:select = 0;break;}}}
1 0
- 双循环链表(包含头指针与尾指针)
- 头指针链表
- 头指针链表
- 链表插入与删除操作中的头、尾指针
- 初学单向链表中的头结点与头指针
- 线性表---单链表(头结点与头指针)
- 头指针与头结点
- (含头指针以及尾指针)循环双向链表各类功能的实现
- 链表的 头指针 头结点
- 链表之头指针
- 数据结构头指针链表
- 链表头结点与头指针
- 双循环链表(C++)
- 链表总结——单链表的头指针、头结点与首元结点
- 头指针与头结点的异同
- 头结点与头指针区别
- 头指针与头结点的区别
- 头指针与头结点的区别
- UI类的扩展
- xcode 6 引用zbar做二维码扫描,集成时报错
- iOS学习之CoreAnimation
- 安卓微博评论界面--随便看看
- Linux Socket CAN驱动 <4.接收数据流程>
- 双循环链表(包含头指针与尾指针)
- 界面设计标准
- An Empirical Study of Regression Test Selection Techniques
- 第五题
- Destroy Tunnels(矩阵水题)
- 指针详解
- 导入jar包在Eclipse中产看中文出现乱码的问题
- JS解析表达式
- 关联规则挖掘基本概念与Aprior算法