(含头指针以及尾指针)循环双向链表各类功能的实现
来源:互联网 发布:中国物联网域名注册 编辑:程序博客网 时间:2024/06/05 19:43
对循环双链表实现下述功能:
void meau(); //菜单函数void Initlist(List *list); //初始化void show(List *list); //打印链表内容bool Push_back(List *list,ElemType x); //尾插法bool Push_front(List *list,ElemType x);//头插法bool Isempty(List *list); //判断链表是否为空bool Pop_back(List *list); //尾删法bool Pop_front(List *list); //头删法Node *Find_val(List *list,ElemType x); //按值查找bool Delete_val(List *list,ElemType x);//按值删除bool modify(List *list,ElemType x); //修改void clear(List *list); //清空链表void destory(List *list); //摧毁链表void reverse(List *list); //逆置链表Node *prio(List *list,ElemType x); //求某个值的前驱Node *next(List *list,ElemType x); //求某个值的后继bool Insert_val(List *list,ElemType x);//按值插入void sort(List *list); //排序(升序)
DCList.h:
#ifndef __DCLIST_H__#define __DCLIST_H__#include<assert.h>#include<iostream>using namespace std;typedef int ElemType;typedef struct Node{struct Node *pre;struct Node *next;ElemType data;}Node;typedef struct List{Node *first;Node *last;int size;}List;void meau(); //菜单函数void Initlist(List *list); //初始化void show(List *list); //打印链表内容bool Push_back(List *list,ElemType x); //尾插法bool Push_front(List *list,ElemType x);//头插法bool Isempty(List *list); //判断链表是否为空bool Pop_back(List *list); //尾删法bool Pop_front(List *list); //头删法Node *Find_val(List *list,ElemType x); //按值查找bool Delete_val(List *list,ElemType x);//按值删除bool modify(List *list,ElemType x); //修改void clear(List *list); //清空链表void destory(List *list); //摧毁链表void reverse(List *list); //逆置链表Node *prio(List *list,ElemType x); //求某个值的前驱Node *next(List *list,ElemType x); //求某个值的后继bool Insert_val(List *list,ElemType x);//按值插入void sort(List *list); //排序(升序)#endifDCList.cpp:
#include"DCList.h"/*菜单函数*/void meau(){cout<<"*****************SeqList********************"<<endl;cout<<" ---zyh_helen"<<endl;cout<<"*[1]InitSeqList [2]Push_back *"<<endl;cout<<"*[3]Push_front [4]Pop_back *"<<endl;cout<<"*[5]Pop_front [6]Find_val *"<<endl;cout<<"*[7]show [0]Quit_syatem*"<<endl;cout<<"*[8]modify [9]Delete_val *"<<endl; cout<<"*[10]clear [11]destory *"<<endl; cout<<"*[12]reverse [13]prio *"<<endl;cout<<"*[14]next [15]sort *"<<endl;cout<<"*[16]Insert_val *"<<endl;}/*初始化链表*/void Initlist(List *list){Node *s = (Node *)malloc(sizeof(Node));assert(s != NULL);s->next = s->pre = s;list->first = list->last = s;list->size = 0;}/*尾插法*/bool Push_back(List *list,ElemType x){Node *s = (Node *)malloc(sizeof(Node));if(s != NULL){s->data = x;list->last->next = s;s->pre = list->last;list->last = s;list->last->next = list->first;list->first->pre = list->last;//s->next = list->first;//list->last = s;list->size++;return true;}elsereturn false;}/*打印链表内容*/void show(List *list){Node *s = list->first->next;while(s != list->first){cout<<s->data<<"-->";s = s->next;}cout<<"NULL"<<endl;}/*头插法*/bool Push_front(List *list,ElemType x){Node *s = (Node *)malloc(sizeof(Node));if(s != NULL){s->data = x;/*和后面元素(原来的第一个元素)连接*/s->next = list->first->next;list->first->next->pre = s;/*和头结点连接*/list->first->next = s;s->pre = list->first;/*若是第一个节点,尾指针该指向它*/if(list->size == 0){list->last = s;}list->size++;return true;}else{cout<<"申请空间失败!"<<endl;return false;}}/*判断链表是否为空*/bool Isempty(List *list){return (list->size == 0);}/*尾删法*/bool Pop_back(List *list){if(Isempty(list)){cout<<"链表已空!"<<endl;return false;}Node *s = list->last->pre;//找到最后一个节点的前驱free(list->last);//释放最后一个节点/*连接*/s->next = list->first;list->last = s;list->size--;return true;}bool Pop_front(List *list){if(Isempty(list)){cout<<"链表已空!"<<endl;return false;}Node *s = list->first->next;//找到第一个节点(要释放的)/*连接*/list->first->next = s->next;s->next->pre = list->first;/*如果要删除的结点是第一个节点,尾指针要改变指向*/if(list->size == 1){list->last = list->first;}free(s);list->size--;return true;}/*查找函数:找到指定元素:返回指向它的指针,找不到:返回NULL*/Node *Find_val(List *list,ElemType x){Node *s = list->first->next;while(s != list->first){if(x == s->data)return s;elses = s->next;}return NULL;}/*按值删除结点*/bool Delete_val(List *list,ElemType x){Node *s = Find_val(list,x);if(s != NULL){/*连接:头删,尾删,都适用*/s->pre->next = s->next;s->next->pre = s->pre;/*释放*/free(s);list->size--;/*如果释放的是最后一个节点,尾指针需要改变指向,其余情况无需改变*/if(s == list->last){list->last = s->pre;}return true;}else{cout<<"the item is not exist!"<<endl;return false;}}/*bool Delete_val(List *list,ElemType x){Node *s = Find_val(list,x);if(s != NULL){if(s == list->first->next){Pop_front(list);}else if(s == list->last)//为什么没加else,删除头结点会出错???{Pop_back(list);}else{s->pre->next = s->next;s->next->pre = s->pre;free(s);list->size--;}return true;}else{cout<<"the item is not exist!"<<endl;return false;}}*//*修改链表中指定的值*/bool modify(List *list,ElemType x){Node *s = Find_val(list,x);ElemType item;if(s != NULL){cout<<"please input a new item:";cin>>item;s->data = item;return true;}else{cout<<"the item is not exist!"<<endl;return false;}}/*清空链表*/void clear(List *list){Node *s = list->first->next;//s总是指向链表中的第一个节点while(s != list->first){list->first->next = s->next;//将链表中的第一个结点空出来free(s);//释放第一个节点s = list->first->next;//重新指向新的第一个节点}list->last = list->first;list->size = 0;}/*销毁链表*/void destory(List *list){clear(list);free(list->first);list->first = list->last = NULL;}/*链表逆置:保留第一个结点,将剩余的结点游离出来,然后依次头插到保留的结点中*/void reverse(List *list){Node *s = list->first->next;//第一个结点Node *p = s->next;//分离出剩余的结点/*第一个结点逆置后成为最后一个结点*/s->next = list->first;list->last = s;while(p != list->first){s = p; //保存游离出来的第一个节点p = p->next;//为下一次头插做准备/*将游离出的第一个节点--->头插-->进去*/s->next = list->first->next;list->first->next->pre = s;s->pre = list->first;list->first->next = s;/*Push_front(list,s->data);free(s);调用Push_front函数,会自动创建结点,所以得释放原来的结点*/}}/*求指定元素的前驱*/Node *prio(List *list,ElemType x){Node *s = Find_val(list,x);if(s != NULL){if(s == list->first->next){cout<<"it doesn't have prio!"<<endl;}else{return s->pre;}}else{cout<<"the item is not exist!"<<endl;return NULL;}}/*求指定元素的后继*/Node *next(List *list,ElemType x){Node *s = Find_val(list,x);if(s != NULL){if(s == list->last){cout<<"it doesn't have next!"<<endl;}else{return s->next;}}else{cout<<"the item is not exist!"<<endl;return NULL;}}/*按值插入:若插入的值已经存在,返回NULL,否则将值插入(假设链表数据有序:升序)*/bool Insert_val(List *list,ElemType x){Node *s = Find_val(list,x);if(s != NULL){cout<<"the item is already exist!"<<endl;return false;}/*创建要插入的结点*/Node *p = (Node *)malloc(sizeof(Node));p->data = x;/*查找要插入位置的前驱*/s = list->first;while(s != list->last){if(s->next->data > x)break;//要插入的位置找到(在s之后插入)elses = s->next;}/*插入*/p->next = s->next;s->next->pre = p;p->pre = s;s->next = p;/*若要插入位置的前驱是最后一个结点,即尾插,则尾指针需要改变指向*/if(s == list->last){list->last = p;}list->size++;return true;}/*升序*/void sort(List *list){Node *s = list->first->next;//第一个结点Node *p = s->next;//分离出剩余的结点/*第一个结点逆置后成为最后一个结点*/s->next = list->first;list->last = s;while(p != list->first){s = p;p = p->next;/*将游离出来的第一个节点按值插入到保存结点中*/Insert_val(list,s->data);free(s);//调用Insert_val()会创建结点,所以应该原来的结点释放}}
main.cpp:
#include"DCList.h"int main(){List mylist;Node *s;Initlist(&mylist);ElemType item;int choice = 1;while(choice){meau();cout<<"input you choice:"<<endl;cin>>choice;switch(choice){case 1:Initlist(&mylist);break;case 2:cout<<"input the item you want to push_back:-1 as a end"<<endl;while(cin>>item,item != -1)Push_back(&mylist,item);break;case 3:cout<<"input the item you want to push_back:-1 as a end"<<endl;while(cin>>item,item != -1)Push_front(&mylist,item);break;case 4:Pop_back(&mylist);break;case 5:Pop_front(&mylist);break;case 6:cout<<"input the item you want to find:"<<endl;cin>>item;Find_val(&mylist,item);if(Find_val(&mylist,item) != NULL)cout<<"the item is found!"<<endl;elsecout<<"the item is not exist:"<<endl;break;case 7:show(&mylist);break;case 8:cout<<"input the item you want to modify:"<<endl;cin>>item;modify(&mylist,item);break;case 9:cout<<"input the item you want to delete:"<<endl;cin>>item;Delete_val(&mylist,item);break;case 10:clear(&mylist);break;case 11:destory(&mylist);break;case 12:reverse(&mylist);break;case 13:cout<<"input the item you want to find it's prio:"<<endl;cin>>item;s = prio(&mylist,item);if(s != NULL)cout<<"it's prio is:"<<s->data<<endl;break;case 14:cout<<"input the item you want to find it's next:"<<endl;cin>>item;s = next(&mylist,item);;if(s != NULL)cout<<"it's next is:"<<s->data<<endl;break;case 15:sort(&mylist);break;case 16:cout<<"input the item you want to insert:"<<endl;cin>>item;Insert_val(&mylist,item);break;default:break;}}destory(&mylist);return 0;}
具体功能:望读者自行测试,如有错误欢迎提出修改意见----->>>zyh_helen
0 0
- (含头指针以及尾指针)循环双向链表各类功能的实现
- (含有头指针以及尾指针)单链表各类功能的实现
- 双向链表(二级指针实现)
- 双向循环链表简单的插入、删除、修改以及查找功能的实现
- 双向循环链表简单的插入、删除、修改以及查找功能的实现
- C++实现双向链表(含头结点)
- 《数据结构》只设置尾指针而不设置头指针的讯循环链表的合并
- 双向+头结点+循环的链表
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 雅虎面试题─有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除。
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 有两个双向循环链表A,B,知道其头指针为:pHeadA,pHeadB,请写一函数将两链表中data值相同的结点删除
- 双向循环链表的头插、中插、尾插、删除、逆序顺序显示(C++实现)
- 利用 双向循环链表 实现通讯录的功能
- 一个双向链表的单指针实现
- 双循环链表(包含头指针与尾指针)
- C++的new operator、operator new和placement new
- 僵尸进程
- 如何快速提高你的android开发水平
- 星巴克全美门店数字地图显示
- 彻底搞清值传递和地址传递
- (含头指针以及尾指针)循环双向链表各类功能的实现
- spark:学习杂记--37
- 自旋锁 互斥锁 区别
- 迪杰斯特拉算法入门
- 经典排序算法-------插入排序法
- Dart更近一步,Sky会一统江湖吗?
- 物与物的互通:解析Thread、AllJoyn、OIC、Bonjour的特点
- Bluemix云平台实战日志:IBM Mobile Data云服务和Android应用开发
- Justice is Given by Light,一条计算几何