当前位置:文档之家› 带有头结点的链表基本操作与其能实现的数据结构,栈和队列

带有头结点的链表基本操作与其能实现的数据结构,栈和队列

.h#ifndef LIST_H_INCLUDED#define LIST_H_INCLUDED/*****本头文件均为带头结点的单链表,功能函数包括对单链表的单个结点的修改,删除等操作,包含对整个单链表整个操作单链表来实现栈,队列等数据结构*****/typedef int ElemType;typedef int Status;typedef struct LNode{ElemType data;struct LNode * next;}LNode, *LinkList;typedef struct LStack{LinkList top;}LStack, *PLStack;//单链表实现栈typedef struct LQueue{LinkList Front;LinkList rear;}LQueue, *PLQueue;//单链表实现队列//单链表操作Status InitList_L(LinkList &L);//构造一个空的单链表Status DestroyList_L(LinkList &L);//销毁单链表LStatus ClearList_L(LinkList &L);//将单链表置为空表int ListLength_L(LinkList L);//求单链表的长度LNode * Search_L(LinkList L, ElemType e);//查找链表L第一个数据域为e的元素,若不存在则返回NULLLNode * NextElem_L(LinkList p);//返回p结点的直接后结点的指针,若P结点是尾元素结点,则返回NULLLNode * MakeNode_L(ElemType e);//构造e结点,返回指向该结点的指针Status InsertAfter_L(LNode *p, LNode *q);//在p结点之后插入q结点Status DeleteAfter_L(LNode *p, ElemType &e);//删除结点P直接结点的后继结点,用e返回结点值,若p为空或指向尾结点则操作失败void ListTraverse_L(LinkList L);//遍历单链表//基于单链表的算法void Find_SortList_L(LinkList L);//链表中的元素排序,查找排序void maopao_SortList_L(LinkList L);//链表中的元素冒泡排序void Fast_SortList_L(LinkList L);//用快速排序对链表元素排序void InverseList(LinkList L);//单链表的重置。

void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc);//将升序的单链表La与Lb归并为新的单链表Lc//链栈Status InitList_Stack(LStack &S);//初始化一个链栈Status DestroyList_Stack(LStack &S);//销毁一个链栈Status StackEmpty_List(LStack &S);//链栈是否为空void ClearStack_List(LStack &S);//清空链栈Status PushStack_List(LStack &S, ElemType e);//往一个链栈中压入元素eStatus PopStack_List(LStack &S, ElemType &e);//链栈顶元素出栈到eStatus getTop_StackList(LStack &S, ElemType &e);//去链栈顶元素到e//队列Status InitList_Queue(LQueue &Q);//初始化一个循环链队void DestroyList_Queue(LQueue &Q);//销毁链队void ClearList_Queue(LQueue &Q);//清空链队Status QueueEmpty_List(LQueue &Q);//对链队判空int QueueLength_List(LQueue Q);//求链队的长度Status PushQueue_List(LQueue &Q, ElemType e);//将元素e入队Status PopQueue_List(LQueue &Q, ElemType &e);//队头元素出队#endif // LIST_H_INCLUDED.cpp#include"List.h"#include<iostream>#include<malloc.h>#define error 0#define ok 1using namespace std;Status InitList_L(LinkList &L)//初始化一个带头结点的链表{L=(LinkList)malloc(sizeof(LNode));if(NULL==L){cout<<"初始化失败!"<<endl;return error;}L->next=NULL;cout<<"初始化成功!"<<endl;return ok;}Status DestroyList_L(LinkList &L)//销毁链表{LinkList p=L, q;while(p){q=p;p=p->next;free(q);}cout<<"销毁链表!"<<endl;return ok;}Status ClearList_L(LinkList &L)//清空链表{LinkList p=L, q;while(p->next){q=p->next;p=p->next;free(q);}cout<<"清空链表!"<<endl;return ok;}int ListLength_L(LinkList L)//求表长度{LinkList p=L;int num=0;while(p->next){p=p->next;++num;}return num;}LNode *Search_L(LinkList L, ElemType e)//在表中查询是否存在元素e,并返回该元素结点{LinkList p=L->next;while(NULL!=p){if(p->data==e){cout<<"查询成功!"<<endl;return p;}elsep=p->next;}cout<<"不存在该元素!"<<endl;return NULL;}LNode *MakeNode_L(ElemType e)//构造值为e的结点,返回结点指针{LinkList p;p=(LinkList)malloc(sizeof(LNode));if(NULL==p){cout<<"创建结点失败!"<<endl;return NULL;}elsep->data=e;return p;}Status InsertAfter_L(LNode *p, LNode *q)//在p结点之后插入q结点{if(NULL==p||NULL==q)return error;q->next=p->next;p->next=q;cout<<"插入成功!"<<endl;return ok;}Status DeleteAfter_L(LNode *p, ElemType &e)//删除结点P直接结点的后继结点,用e返回结点值,若p为空或指向尾结点则操作失败{if(NULL==p){cout<<"删除结点失败!"<<endl;return error;}LinkList q;q=p->next;p->next=q->next;free(q);cout<<"删除成功!"<<endl;return ok;}void ListTraverse_L(LinkList L)//遍历单链表{LinkList p=L->next;while(p){cout<<p->data<<" ";p=p->next;}cout<<endl;}Status InitList_Stack(LStack &S)//初始化一个链栈{S.top=(LinkList)malloc(sizeof(LNode));if(NULL==S.top)return error;cout<<"Inite success!"<<endl;S.top->next=NULL;return ok;}Status DestroyList_Stack(LStack &S)//销毁一个链栈{LinkList p=S.top, q;while(p){q=p;p=q->next;free(q);}return ok;}Status StackEmpty_List(LStack &S)//链栈是否为空{if(NULL==S.top->next){cout<<"空栈!"<<endl;return ok;}elsereturn error;}void ClearStack_List(LStack &S)//清空链栈{LinkList p=S.top->next, q;while(p){q=p;p=p->next;free(q);}}Status PushStack_List(LStack &S, ElemType e)//往一个链栈中压入元素e {LinkList q;q=(LinkList)malloc(sizeof(LNode));q->data=e;q->next=S.top->next;S.top->next=q;cout<<"Push success!"<<endl;return ok;}Status PopStack_List(LStack &S, ElemType &e)//链栈顶元素出栈到e {LinkList q=S.top->next;if(NULL==q)return error;e=q->data;S.top->next=q->next;free(q);return ok;}Status getTop_StackList(LStack &S, ElemType &e)//去链栈顶元素到e {if(NULL==S.top->next)return error;e=S.top->next->data;return ok;}Status InitList_Queue(LQueue &Q)//初始化一个循环链队{Q.Front=(LinkList)malloc(sizeof(LNode));if(NULL==Q.Front)return error;Q.Front->next=NULL;Q.rear=Q.Front->next;cout<<"InitList Queue success!"<<endl;return ok;}void DestroyList_Queue(LQueue &Q)//销毁链队{LinkList p=Q.Front, q;while(p){q=p;p=p->next;free(q);}cout<<"DestroyList Queue success!"<<endl;}void ClearList_Queue(LQueue &Q)//清空链队{LinkList p=Q.Front->next, q;while(p){q=p;p=p->next;free(q);}cout<<"clear ListQueue success!"<<endl;}Status QueueEmpty_List(LQueue &Q)//对链队判空{if(Q.Front->next==Q.rear)return ok;elsereturn error;}int QueueLength_List(LQueue Q)//求链队的长度{int num=0;num=ListLength_L(Q.Front);return num;}Status PushQueue_List(LQueue &Q, ElemType e)//将元素e入队{LinkList q;q=(LinkList)malloc(sizeof(LNode));if(NULL==q)return error;q->data=e;q->next=NULL;if(Q.rear==NULL)Q.rear=Q.Front;Q.rear->next=q;Q.rear=q;return ok;}Status PopQueue_List(LQueue &Q, ElemType &e)//队头元素出队{if(QueueEmpty_List(Q))return error;LinkList q=Q.Front->next;e=q->data;Q.Front->next=q->next;free(q);return ok;}void maopao_SortList_L(LinkList L)//链表中的元素排序,冒泡排序{ElemType e;LinkList p=L->next, temp;while(p){temp=p->next;while(temp){if(p->data>temp->data)e=p->data, p->data=temp->data, temp->data=e;temp=temp->next;}}}void Find_SortList_L(LinkList L)//链表中的元素排序,查找排序{LinkList p=L->next, temp, q;ElemType e;while(p){temp=p;q=p->next;while(q){if(temp->data>q->data)temp=q;q=q->next;}if(temp!=p){e=p->data;p->data=temp->data;temp->data=e;}p=p->next;}}void InverseList(LinkList L)//单链表的重置。

相关主题