双循环链表(包含头指针与尾指针)

来源:互联网 发布:磁力链接解析源码 编辑:程序博客网 时间: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
原创粉丝点击