(含有头指针以及尾指针)单链表各类功能的实现
来源:互联网 发布:淘宝官方网站注册 编辑:程序博客网 时间:2024/05/17 04:49
对单链表实现如下功能:
void InitList(List *list); //初始化单链表bool push_back(List *list,ElemType x); //尾插法void show_seqlist(List *list); //显示链表内容bool push_front(List *list,ElemType x);//头插法bool pop_back(List *list); //尾删法bool pop_front(List *list); //头删法Node *find(List *list,ElemType x); //查找函数,找到返回指向该元素的指针bool modify(List *list,ElemType x); //修改某一元素的值void delete_val(List *list,ElemType x);//按值删除void clear(List *list); //清空链表void destroy(List *list); //销毁链表int length(List *list); //求链表长度void resver(List *list); //逆至链表void prio(List *list,ElemType x); //求某个值的前驱void next(List *list,ElemType x); //求某个值的后继
#ifndef __LIST_H__#define __LIST_H__#include<assert.h>#include<iostream>using namespace std;typedef int ElemType;typedef struct Node{ElemType data;struct Node *next;}Node;typedef struct List{Node *first;Node *last;int size;}List;void InitList(List *list); //初始化单链表bool push_back(List *list,ElemType x); //尾插法void show_seqlist(List *list); //显示链表内容bool push_front(List *list,ElemType x);//头插法bool pop_back(List *list); //尾删法bool pop_front(List *list); //头删法Node *find(List *list,ElemType x); //查找函数,找到返回指向该元素的指针bool modify(List *list,ElemType x); //修改某一元素的值void delete_val(List *list,ElemType x);//按值删除void clear(List *list); //清空链表void destroy(List *list); //销毁链表int length(List *list); //求链表长度void resver(List *list); //逆至链表void prio(List *list,ElemType x); //求某个值的前驱void next(List *list,ElemType x); //求某个值的后继#endif
List.cpp:
#include"List.h"//初始化单链表void InitList(List *list){Node *s = (Node *)malloc(sizeof(Node));assert(s != NULL);s->next = NULL;list->first = list->last = s;list->size = 0;}//尾插法:开辟并初始化--->>连接---->>指针后移bool push_back(List *list,ElemType x){Node *s = (Node *)malloc(sizeof(Node));//开辟一个结点if(s == NULL){return false;}s->next = NULL;//对节点的初始化s->data = x;list->last->next = s;//连接list->last = s; //后移(尾指针后移)list->size++;return true;}//打印链表的内容void show_seqlist(List *list){Node *p = list->first->next;while(p != NULL){cout<<p->data<<"--->";p = p->next;}cout<<"NULL"<<endl;}//头插法:开辟并初始化--->>连接---->>指针后移 !!注意特殊情况!!bool push_front(List *list,ElemType x){Node *s = (Node *)malloc(sizeof(Node));if(s == NULL){return false;}s->data = x;s->next = list->first->next;list->first->next = s;//注意:如果是第一个结点,则尾指针需要改变指向即指向第一个结点//(不再指向头)如果不是第一个结点,尾指针指向无需改变 if(list->size == 0){list->last = s;}list->size++;return true;}//尾删法:找到最后一个节点的前驱(指向赋空)---->尾指针指向它--->size - 1bool pop_back(List *list){if(list->size == 0){cout<<"链表已空"<<endl;return false;}Node *pre = list->first;while(pre->next != list->last)//找到要删除节点(最后一个结点)的前驱{pre = pre->next;}pre->next = NULL;//因为该前驱要作为尾结点,所以其指针域得赋空free(list->last);//释放要删除的结点list->last = pre;//尾指针指向改变/*pre->next = NULL;list->last = pre;free(pre);pre = NULL;//free(list->last);*/list->size--;return true;}//free(p)作用是:释放p所指向的空间,而非释放指针p!!!!!//动态开辟的空间才需要手工释放,其他的空间系统自动回收//头删法:释放第一个节点->size-1(如果只有一个节点,释放它之后尾指针得指向头结点),其他情况尾指针不变bool pop_front(List *list){if(list->size == 0){cout<<"链表已空"<<endl;return false;}Node *p = list->first->next;//p指向要释放的第一个节点list->first->next = p->next;//头指针指向下一个节点free(p); //释放第一个节点if(list->size == 1) {list->last = list->first;//如果只有一个节点,释放它之后尾指针得指向头结点),其他情况尾指针不变}list->size--;return true;}//查找函数/*Node *find(List *list,ElemType x){Node *p = list->first->next;//p指向第一个节点while(p != NULL){if(x == p->data)return p;elsep = p->next;}return NULL;}*/Node *find(List *list,ElemType x){Node *p = list->first->next;//p指向第一个节点while(p!=NULL && p->data!= x){p = p->next;}return p;//while循环退出条件:没找到则-->p=NULL,找到p为指向所寻找节点的指针}//修改函数bool modify(List *list,ElemType x){ElemType item;Node *p = find(list,x);if(p != NULL){cout<<"Please input the new value:"<<endl;cin>>item;p->data = item;cout<<"it is modified"<<endl;return true;}elsecout<<"it's not exist!"<<endl;}//按值删除结点void delete_val(List *list,ElemType x){Node *p = find(list,x); //找到要删除的结点if(p != NULL){if(p == list->first->next)//如果是第一个结点(头删法){pop_front(list);}else if(p == list->last) //如果是最后一个结点(尾删法){pop_back(list);}else //既不是第一个结点,也不是最后一个节点{p->data = p->next->data;//将要删除的结点的data赋值为下一个节点的datap->next = p->next->next;//连接free(p->next); //将要删除的结点的下一个结点释放}/*else //既不是第一个结点,也不是最后一个节点{Node *pre = list->first;while(pre->next != p)//找到要删除节点的前驱{pre = pre->next;}pre->next = p->next;//连接free(p); //释放要删除的结点}*/list->size--;cout<<"it is deleted!"<<endl;}else{cout<<"it is not exist!"<<endl;}}//清空单链表/*void clear(List *list,ElemType x){for(int i=0;i<list->size;++i){pop_back(list);//或者pop_front(list)}}*/void clear(List *list){Node *p = list->first->next;//p指向第一个节点while(p != NULL){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;//头(尾)指针赋空,防止成为野指针}//求链表长度int length(List *list){return list->size;}//链表逆至/*改变指针的指向*/void resver(List *list){Node *pre = list->first->next;//pre指向第一个节点Node *p = pre->next; // p指向第二个结点pre->next = NULL; //逆序之后第一个节点成为最后一个节点,所以next=NULLwhile(p != NULL){Node *pre1 = pre;//将当前的指向保存下来Node *p1 = p;pre = p; //为下一次(第n-1次)交换做准备(必须在指向改变之后进行!!!!!)p = p->next;p1->next = pre1;//交换当前两个(第n次)后一个指向前一个}list->first->next = pre; //退出循环,p=NULL,pre指向原来的最后一个结点(逆序后成为第一个)}/*交换值*//*void resver(List *list){Node *left = list->first->next;Node *right = list->last;Node *p = list->first;while(left != right){left->data = left->data + right->data;//对称的两个数交换right->data = left->data - right->data;left->data = left->data - right->data;while(p->next != right)//找到倒数第二个结点{p = p->next;}right = p;//为下一次交换做准备left = left->next;}}*///求某个值的前驱void prio(List *list,ElemType x){Node *p = find(list,x);if(p == NULL){cout<<"it is not exist!\n"<<endl;}if(p == list->first->next){cout<<"it does not have next"<<endl;}else{Node *pre = list->first;while(pre->next != p){pre = pre->next;}cout<<"it's prio is found"<<endl;cout<<"it is"<<pre->data<<endl;;}}//求某个值的后继void next(List *list,ElemType x){Node *p = find(list,x);if(p == NULL){cout<<"it is not exist!\n"<<endl;}if(p == list->last){cout<<"it does not have next"<<endl;}else{cout<<"it's next is found"<<endl;cout<<"it is"<<p->next->data<<endl;}}main.cpp:
#include"List.h"void main(){List mylist;InitList(&mylist);int select = 1;ElemType item;Node *p = NULL;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] find *"<<endl;cout<<"* [7] modify [8] clear *"<<endl;cout<<"* [9] destroy [10]delete_val *"<<endl;cout<<"* [11] resver [12]length *"<<endl;cout<<"* [13] prio [14]next *"<<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<<"输入你要查找的值:";cin>>item;p =find(&mylist,item);if(p != NULL)cout<<"it is found!"<<endl;elsecout<<"it is not exit!"<<endl;break;case 7:cout<<"请输入要修改的值:";cin>>item;modify(&mylist,item);break;case 8:clear(&mylist);break;case 9:destroy(&mylist);break;case 10:cout<<"请输入要删除的值:";cin>>item;delete_val(&mylist,item);break;case 11:resver(&mylist);break;case 12:{int n = length(&mylist);cout<<"the length of the list is:"<<n<<endl;}break;case 13:cout<<"输入你要查找前驱的值:";cin>>item;prio(&mylist,item);break;case 14:cout<<"输入你要查找后继的值:";cin>>item;next(&mylist,item);break;default:break;}}destroy(&mylist);//函数调用完之后,自动销毁链表}
0 0
- (含有头指针以及尾指针)单链表各类功能的实现
- (含头指针以及尾指针)循环双向链表各类功能的实现
- 顺序栈(含有栈顶指针,栈底指针)的实现以及编写过程中的一些疑惑的解决
- 深入理解指针以及二级指针(指针的指针)
- 各类指针
- 单链表的头结点和头指针
- mfc各类指针的获得
- 含有头结点的单链表,实现部分功能,希望大家能够给予指点
- 含有指针类的拷贝
- 单链表(头指针)
- 指针以及指向指针的指针
- 指针以及指针的分类
- 双循环链表(包含头指针与尾指针)
- 只有头指针的单链表逆序
- strlen的递归,常规(创建计数器),以及指针实现
- 数据结构——单链表的头指针、头结点…
- 结构之美:单链表的头结点与头指针
- 结构之美:单链表的头结点与头指针
- EF实现分页查询+条件查询+排序
- matlab中遇到的一些问题
- 一例 Hive join 优化实战
- Isomorphic Strings
- python爬取京东所有iphone的价格和名称
- (含有头指针以及尾指针)单链表各类功能的实现
- 检测内存泄露
- NSAttributedString 详解
- csdn里面写入自己的源码
- Memory Analyzer 分析内存溢出详解
- 范钢:一堂如何提高代码质量的培训课
- 一文读懂机器学习,大数据/自然语言处理/算法全有了……
- Rails 列表加分页功能
- 彻丝衔倍字研翘胁杂研韧嚎瞧郊遮