[数据结构]链表相关的实现LinkList.cpp
LinkList.cpp //链表相关操作的实现
//
// Created by leoxae on 19-11-5.
//
#include "LinkList.h"
/**
* [1]头插法建立单链表
* @return
*/
LinkList LinkListclass::HeadInsertCreateList(void) {
char ch;
LinkList head;
ListNode *p;
head = NULL;/*初始化为空*/
ch = getchar();
while (ch != '\n') {
p = (ListNode *) malloc(sizeof(ListNode));/*分配空间*/
p->data = ch;/*数据域赋值*/
p->next = head;/*指定后继指针*/
head = p;/*head指针指定到新插入的结点上*/
ch = getchar();
}
return (head);
}
/**
* [2]尾插法建立单链表
* @return
*/
LinkList LinkListclass::TailInsertCreateList() {
char ch;
LinkList head;
ListNode *p, *r;
head = NULL;
r = NULL;/*r为尾指针*/
while ((ch = getchar()) != '\n') {
p = (ListNode *) malloc(sizeof(ListNode));
p->data = ch;
if (head == NULL)
head = p;/*head 指向第一个插入结点*/
else
r->next = p;/*插入到链表尾部*/
r = p;/*r指向最新结点,即最后结点*/
}
if (r != NULL)
r->next = NULL;/*链表尾部结点的后继指针指定为空*/
return (head);
}
/**
* [3]按序号查找单链表
* @param head
* @param i
* @return
*/
ListNode *LinkListclass::getnode(LinkList head, int i) {
int j;
ListNode *p;
p = head;
j = 0;
while (p->next && j < i) {/*遍历第i个结点前的所有结点*/
p = p->next;
j++;
}
if (i == j) {
printf("%c\n", p->data);
return p;
} else
return NULL;
}
/**
* [4]按值查找单链表
* @param head
* @param key
* @return
*/
ListNode *LinkListclass::locatenode(LinkList head, char key) {
ListNode *p = head;
while (p->next && p->data != key)
p = p->next;
if (p != NULL)
printf("%c\n", p->data);
return p;
}
/**
* []插入元素e到表L
* @param head
* @param x
* @param i
*/
void LinkListclass::insertnode(LinkList head, char x, int i) {
int j = 0;
ListNode *p, *s;
p = head;
while (p && j < i - 1) {
p = p->next;
++j;
}
if (!p || j > i - 1)
exit(1);
s = (LinkList) malloc(sizeof(ListNode));
s->data = x;
s->next = p->next;
p->next = s;
}
/**
* [6]从表L中删除元素e
* @param head
* @param i
*/
void LinkListclass::deletelist(LinkList head, int i) {
int j = 0;
ListNode *p, *r;
p = head;
while (p && j < i - 1) {
p = p->next;
++j;
}
if (!p->next || j > i - 1)
exit(1);
r = p->next;
p->next = r->next;
free(r);
}
/**
* [7]合并两个链表
* @param list1
* @param list2
* @return
*/
LinkList LinkListclass::concatenate(LinkList list1, LinkList list2) {
ListNode *temp;
if (list1 == NULL)
return list2;
else {
if (list2 != NULL) {
for (temp = list1; temp->next; temp = temp->next); /*遍历到list1的末尾*/
temp->next = list2;/*将list2链接到list1末尾*/
}
}
return list1;
}
//----------------------------[单循环链表LoopList基本操作]-----------------------------
/**
* [1]初始化表L
* @param L
* @return
*/
Status LinkListclass::InitList_CL(LoopLinkList *L) { /* 操作结果:构造一个空的线性表L */
*L = (LoopLinkList) malloc(sizeof(struct LNode)); /* 产生头结点,并使L指向此头结点 */
if (!*L) /* 存储分配失败 */
exit(ERROR);
(*L)->next = *L; /* 指针域指向头结点 */
return OK;
}
/**
* [2]插入元素e到表L
* @param L
* @param i
* @param e
* @return
*/
Status LinkListclass::ListInsert_CL(LoopLinkList *L, int i, ElemType e) /* 改变L */
{ /* 在L的第i个位置之前插入元素e */
LoopLinkList p = (*L)->next, s; /* p指向头结点 */
int j = 0;
if (i <= 0 || i > ListLength_CL(*L) + 1) /* 无法在第i个元素之前插入 */
return ERROR;
while (j < i - 1) /* 寻找第i-1个结点 */
{
p = p->next;
j++;
}
s = (LoopLinkList) malloc(sizeof(struct LNode)); /* 生成新结点 */
s->data = e; /* 插入L中 */
s->next = p->next;
p->next = s;
if (p == *L) /* 改变尾结点 */
*L = s;
return OK;
}
/**
* [3]删除表中的元素
* @param L 线性表
* @param i
* @param e
* @return
*/
Status LinkListclass::ListDelete_CL(LoopLinkList *L, int i, ElemType *e) /* 改变L */
{ /* 删除L的第i个元素,并由e返回其值 */
LoopLinkList p = (*L)->next, q; /* p指向头结点 */
int j = 0;
if (i <= 0 || i > ListLength_CL(*L)) /* 第i个元素不存在 */
return ERROR;
while (j < i - 1) /* 寻找第i-1个结点 */
{
p = p->next;
j++;
}
q = p->next; /* q指向待删除结点 */
p->next = q->next;
*e = q->data;
if (*L == q) /* 删除的是表尾元素 */
*L = p;
free(q); /* 释放待删除结点 */
return OK;
}
/**
* [4]返回表L的前驱
* @param L
* @param cur_e
* @param pre_e
* @return
*/
Status LinkListclass::PriorElem_CL(LoopLinkList L, ElemType cur_e, ElemType *pre_e) { /* 初始条件:线性表L已存在 */
/* 操作结果:若cur_e是L的数据元素,且不是第一个,则用pre_e返回它的前驱, */
/* 否则操作失败,pre_e无定义 */
LoopLinkList q, p = L->next->next; /* p指向第一个结点 */
q = p->next;
while (q != L->next) /* p没到表尾 */
{
if (q->data == cur_e) {
*pre_e = p->data;
return TRUE;
}
p = q;
q = q->next;
}
return FALSE;
}
/**
* [5]返回表L的后继
* @param L
* @param cur_e
* @param next_e
* @return
*/
Status LinkListclass::NextElem_CL(LoopLinkList L, ElemType cur_e, ElemType *next_e) { /* 初始条件:线性表L已存在 */
/* 操作结果:若cur_e是L的数据元素,且不是最后一个,则用next_e返回它的后继, */
/* 否则操作失败,next_e无定义 */
LoopLinkList p = L->next->next; /* p指向第一个结点 */
while (p != L) /* p没到表尾 */
{
if (p->data == cur_e) {
*next_e = p->next->data;
return TRUE;
}
p = p->next;
}
return FALSE;
}
/**
* [6]返回L中数据元素个数
* @param L
* @return
*/
int LinkListclass::ListLength_CL(LoopLinkList L) { /* 初始条件:L已存在。操作结果:返回L中数据元素个数 */
int i = 0;
LoopLinkList p = L->next; /* p指向头结点 */
while (p != L) /* 没到表尾 */
{
i++;
p = p->next;
}
return i;
}
/**
* [7]返回L中数据元素的位序
* @param L
* @param e
* @param compare
* @return
*/
int LinkListclass::LocateElem_CL(LoopLinkList L, ElemType e,
Status(*compare)(ElemType, ElemType)) { /* 初始条件:线性表L已存在,compare()是数据元素判定函数 */
/* 操作结果:返回L中第1个与e满足关系compare()的数据元素的位序。 */
/* 若这样的数据元素不存在,则返回值为0 */
int i = 0;
LoopLinkList p = L->next->next; /* p指向第一个结点 */
while (p != L->next) {
i++;
if (compare(p->data, e)) /* 满足关系 */
return i;
p = p->next;
}
return 0;
}
/**
* [8]列表遍历
* @param L
* @param vi
* @return
*/
Status LinkListclass::ListTraverse_CL(LoopLinkList L, void(*vi)(ElemType)) {
/* 初始条件:L已存在。操作结果:依次对L的每个数据元素调用函数vi()。
* 一旦vi()失败,则操作失败 */
LoopLinkList p = L->next->next;
while (p != L->next) {
vi(p->data);
p = p->next;
}
printf("\n");
return OK;
}
/**
* [9]两个元素比较
* @param c1
* @param c2
* @return
*/
Status LinkListclass::compare(ElemType c1, ElemType c2) {
if (c1 == c2)
return TRUE;
else
return FALSE;
}
/**
* [10]访问元素并打印
* @param c
*/
void LinkListclass::visit(ElemType c) {
printf("%d ", c);
}
/**
* [11]获取元素值
* @param L
* @param i
* @param e
* @return
*/
Status LinkListclass::GetElem_CL(LoopLinkList L, int i, ElemType *e) { /* 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
int j = 1; /* 初始化,j为计数器 */
LoopLinkList p = L->next->next; /* p指向第一个结点 */
if (i <= 0 || i > ListLength_CL(L)) /* 第i个元素不存在 */
return ERROR;
while (j < i) { /* 顺指针向后查找,直到p指向第i个元素 */
p = p->next;
j++;
}
*e = p->data; /* 取第i个元素 */
return OK;
}
/**
* [12]判断是否为空
* @param L
* @return
*/
Status LinkListclass::ListEmpty_CL(LoopLinkList L) { /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
if (L->next == L) /* 空 */
return TRUE;
else
return FALSE;
}
/**
* [13]重置L为空表
* @param L
* @return
*/
Status LinkListclass::ClearList_CL(LoopLinkList *L) /* 改变L */
{ /* 初始条件:线性表L已存在。操作结果:将L重置为空表 */
LoopLinkList p, q;
*L = (*L)->next; /* L指向头结点 */
p = (*L)->next; /* p指向第一个结点 */
while (p != *L) /* 没到表尾 */
{
q = p->next;
free(p);
p = q;
}
(*L)->next = *L; /* 头结点指针域指向自身 */
return OK;
}
/**
* [14]销毁线性表L
* @param L
* @return
*/
Status LinkListclass::DestroyList_CL(LoopLinkList *L) { /* 操作结果:销毁线性表L */
LoopLinkList q, p = (*L)->next; /* p指向头结点 */
while (p != *L) /* 没到表尾 */
{
q = p->next;
free(p);
p = q;
}
free(*L);
*L = NULL;
return OK;
}
/**
* [15]仅设表尾指针循环链表的合并
* @param La
* @param Lb
*/
void LinkListclass::MergeList_CL(LoopLinkList *La, LoopLinkList Lb) {
LoopLinkList p = Lb->next;
Lb->next = (*La)->next;
(*La)->next = p->next;
free(p);
*La = Lb;
}
//----------------------------[双向链表DuLinkList基本操作]-----------------------------
/**
* [1]初始化双向链表
* @param L
* @return
*/
Status LinkListclass::InitDuList(DuLinkList *L) { /* 产生空的双向循环链表L */
*L = (DuLinkList) malloc(sizeof(DuLNode));
if (*L) {
(*L)->next = (*L)->prior = *L;
return OK;
} else
return ERROR;
}
/**
* [2]求双向链表表长
* @param L
* @return
*/
int LinkListclass::DuListLength(DuLinkList L)
{ /* 初始条件:L已存在。操作结果:返回L中数据元素个数 */
int i=0;
DuLinkList p=L->next; /* p指向第一个结点 */
while(p!=L) /* p没到表头 */
{
i++;
p=p->next;
}
return i;
}
/**
* [3]在双向链表L中返回第i个元素的位置指针
* @param L
* @param i
* @return
*/
DuLinkList LinkListclass::GetElemP(DuLinkList L,int i) /* 另加 */
{
int j;
DuLinkList p=L;
for(j=1;j<=i;j++)
p=p->next;
return p;
}
/**
* [4]在带头结点的双链循环线性表L中第i个位置之前插入元素e,
* i的合法值为1≤i≤表长+1
* @param L
* @param i
* @param e
* @return
*/
Status LinkListclass::DuListInsert(DuLinkList L,int i,ElemType e)
{
DuLinkList p,s;
if(i<1||i>DuListLength(L)+1) /* i值不合法 */
return ERROR;
p=GetElemP(L,i-1); /* 在L中确定第i-1个元素的位置指针p */
if(!p) /* p=NULL,即第i-1个元素不存在 */
return ERROR;
s=(DuLinkList)malloc(sizeof(DuLNode));
if(!s)
return ERROR;
s->data=e; /* 在第i-1个元素之后插入 */
s->prior=p;
s->next=p->next;
p->next->prior=s;
p->next=s;
return OK;
}
/**
* [5]双向链表正向遍历访问元素
* @param L
* @param visit
*/
void LinkListclass::DuListTraverse(DuLinkList L,void(*visit)(ElemType))
{ /* 由双链循环线性表L的头结点出发,正序对每个数据元素调用函数visit() */
DuLinkList p=L->next; /* p指向头结点 */
while(p!=L)
{
visit(p->data);
p=p->next;
}
printf("\n");
}
/**
* [6]双向链表正向遍历访问元素
* @param L
* @param visit
*/
void LinkListclass::ListTraverseBack(DuLinkList L,void(*visit)(ElemType))
{ /* 由双链循环线性表L的头结点出发,逆序对每个数据元素调用函数visit()。另加 */
DuLinkList p=L->prior; /* p指向尾结点 */
while(p!=L)
{
visit(p->data);
p=p->prior;
}
printf("\n");
}
/**
* [7]双向链表访问元素并打印
* @param c
*/
void LinkListclass::vd(ElemType c) /* ListTraverse()调用的函数(类型一致) */
{
printf("%d ",c);
}
/**
* [8]双向链表元素的删除
* @param L
* @param i
* @param e
* @return
*/
Status LinkListclass::DuListDelete(DuLinkList L,int i,ElemType *e)
{ /* 删除带头结点的双链循环线性表L的第i个元素,i的合法值为1≤i≤表长+1 */
DuLinkList p;
if(i<1||i>DuListLength(L)) /* i值不合法 */
return ERROR;
p=GetElemP(L,i); /* 在L中确定第i个元素的位置指针p */
if(!p) /* p=NULL,即第i个元素不存在 */
return ERROR;
*e=p->data;
p->prior->next=p->next;
p->next->prior=p->prior;
free(p);
return OK;
}
/**
* [9]双向链表重置为空表
* @param L
* @return
*/
Status LinkListclass::ClearDuList(DuLinkList L) /* 不改变L */
{ /* 初始条件:L已存在。操作结果:将L重置为空表 */
DuLinkList q,p=L->next; /* p指向第一个结点 */
while(p!=L) /* p没到表头 */
{
q=p->next;
free(p);
p=q;
}
L->next=L->prior=L; /* 头结点的两个指针域均指向自身 */
return OK;
}
/**
* [10]双向链表判空
* @param L
* @return
*/
Status LinkListclass::DuListEmpty(DuLinkList L)
{ /* 初始条件:线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE */
if(L->next==L&&L->prior==L)
return TRUE;
else
return FALSE;
}
/**
* [11]双向链表元素赋值
* 当第i个元素存在时,其值赋给e并返回OK,
* 否则返回ERROR
* @param L
* @param i
* @param e
* @return
*/
Status LinkListclass::GetDuElem(DuLinkList L,int i,ElemType *e)
{ /* 当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
int j=1; /* j为计数器 */
DuLinkList p=L->next; /* p指向第一个结点 */
while(p!=L&&j<i) /* 顺指针向后查找,直到p指向第i个元素或p指向头结点 */
{
p=p->next;
j++;
}
if(p==L||j>i) /* 第i个元素不存在 */
return ERROR;
*e=p->data; /* 取第i个元素 */
return OK;
}
LinkList.h
//
// Created by leoxae on 19-11-5.
//
#ifndef ALGORITHMSLIBRARY_LINKLIST_H
#define ALGORITHMSLIBRARY_LINKLIST_H
#include "stdio.h"
#include "string"
#include "iostream"
using namespace std;
/* 函数结果状态代码 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
typedef int ElemType;
//单链表数据结构定义
typedef char datatype;
typedef struct Node{
datatype data;
struct Node *next;
} ListNode;
typedef ListNode *LinkList;
//单循环链表数据结构定义
struct LNode {
ElemType data;
struct LNode *next;
};
typedef struct LNode *LoopLinkList; /* 另一种定义LinkList的方法 */
//双向链表数据结构定义
typedef struct DuLNode{
ElemType data;
struct DuLNode *prior,*next;
} DuLNode,*DuLinkList;
class LinkListclass{
public:
//-------------------[单链表LinkList基本操作]-------------------
//[1]头插法建立单链表
LinkList HeadInsertCreateList(void);
//[2]尾插法建立单链表
LinkList TailInsertCreateList();
//[3]按序号查找单链表
ListNode * getnode(LinkList head, int i);
//[4]按值查找单链表
ListNode *locatenode(LinkList head, char key);
//[5]插入元素e到表L
void insertnode(LinkList head, char x, int i);
//[6]从表L中删除元素e
void deletelist(LinkList head, int i);
//[7]合并两个链表
LinkList concatenate(LinkList list1, LinkList list2);
//-------------------[单循环链表LoopList基本操作]-------------------
//[1]初始化,构造空表L
Status InitList_CL(LoopLinkList *L);
//[2]插入元素
Status ListInsert_CL(LoopLinkList *L, int i, ElemType e);
//[3]删除元素
Status ListDelete_CL(LoopLinkList *L, int i, ElemType *e);
//[4]返回表L的前驱
Status PriorElem_CL(LoopLinkList L, ElemType cur_e, ElemType *pre_e);
//[5]返回表L的后继
Status NextElem_CL(LoopLinkList L, ElemType cur_e, ElemType *next_e);
//[6]求表长度
int ListLength_CL(LoopLinkList L);
//[7]返回L中数据元素的位序
int LocateElem_CL(LoopLinkList L, ElemType e, Status(*compare)(ElemType, ElemType));
//[8]列表遍历
Status ListTraverse_CL(LoopLinkList L, void(*vi)(ElemType));
//[9]比较元素大小
static Status compare(ElemType c1, ElemType c2);
//[10]访问元素并打印
static void visit(ElemType c);
//[11]获取元素值
Status GetElem_CL(LoopLinkList L,int i,ElemType *e);
//[12]判断是否为空
static Status ListEmpty_CL(LoopLinkList L);
//[13]重置为空表
Status ClearList_CL(LoopLinkList *L);
//[14]销毁表
Status DestroyList_CL(LoopLinkList *L);
//[15]仅设表尾指针循环链表的合并
void MergeList_CL(LoopLinkList *La, LoopLinkList Lb);
//-------------------[双向链表DuLinkList基本操作]-------------------
//[1]初始化双向链表
Status InitDuList(DuLinkList *L);
//[2]求双向链表表长
int DuListLength(DuLinkList L);
//[3]在双向链表L中返回第i个元素的位置指针
DuLinkList GetElemP(DuLinkList L, int i);
//[4]双向链表插入元素
Status DuListInsert(DuLinkList L, int i, ElemType e);
//[5]双向链表正向遍历访问元素
void DuListTraverse(DuLinkList L, void (*visit)(ElemType));
//[6]双向链表逆向遍历访问元素
void ListTraverseBack(DuLinkList L, void (*visit)(ElemType));
//[7]双向链表访问元素并打印
static void vd(ElemType c);
//[8]双向链表元素的删除
Status DuListDelete(DuLinkList L, int i, ElemType *e);
//[9]双向链表重置为空表
Status ClearDuList(DuLinkList L);
//[10]双向链表判空
Status DuListEmpty(DuLinkList L);
//[11]双向链表元素赋值
Status GetDuElem(DuLinkList L, int i, ElemType *e);
};
#endif //ALGORITHMSLIBRARY_LINKLIST_H
LinkListManager.cpp //链表相关实现函数的调用
//
// Created by leoxae on 19-11-6.
//
#include "LinkListManager.h"
//------------------[单链表的操作]------------------
/**
* 头插法建立单链表
*/
void LinkListManager::headinsertcreateList() {
LinkListclass List;
cout << "请输入元素建立单链表:" << endl;
LinkList newlist = List.HeadInsertCreateList();
do {
printf("%c\n", newlist->data);
newlist = newlist->next;
} while (newlist != NULL);
printf("\n");
}
/**
* 尾插法建立单链表
*/
void LinkListManager::tailinsertcreateList() {
LinkListclass List;
cout << "请输入元素建立单链表:" << endl;
LinkList newlist = List.TailInsertCreateList();
do {
printf("%c", newlist->data);
newlist = newlist->next;
} while (newlist != NULL);
printf("\n");
}
/**
* 按序号查找单链表
*/
void LinkListManager::numGetElem() {
LinkListclass List;
LinkList list;
ListNode *node;
int i = 0;
cout << "请输入元素建立单链表:" << endl;
list = List.TailInsertCreateList();
node = List.getnode(list, i);
}
/**
* 按值查找单链表
*/
void LinkListManager::keyGetElem() {
LinkListclass List;
LinkList list;
ListNode *node;
char key = 'c';
cout << "请输入元素建立单链表:" << endl;
list = List.TailInsertCreateList();
node = List.locatenode(list, key);
}
/**
* 插入元素e到表L
*/
void LinkListManager::insertElem() {
LinkListclass List;
LinkList list;
int i = 1;
char x = 'c';
cout << "请输入元素建立单链表:" << endl;
list = List.TailInsertCreateList();
List.insertnode(list, x, i);
do {
printf("%c", list->data);
list = list->next;
} while (list != NULL);
printf("\n");
}
/**
* 从表L中删除元素e
*/
void LinkListManager::deleteElem() {
LinkListclass List;
LinkList list;
int i = 1;
char x = 'c';
cout << "请输入元素建立单链表:" << endl;
list = List.TailInsertCreateList();
List.deletelist(list, i);
do {
printf("%c", list->data);
list = list->next;
} while (list != NULL);
printf("\n");
}
/**
* 合并两个链表
*/
void LinkListManager::mergeList() {
LinkListclass List;
LinkList list1, list2, list3;
cout << "请输入元素分别建立单链表1和单链表2:" << endl;
list1 = List.TailInsertCreateList();
list2 = List.TailInsertCreateList();
list3 = List.concatenate(list1, list2);
do {
printf("%c", list3->data);
list3 = list3->next;
} while (list3 != NULL);
printf("\n");
}
//------------------[单循环链表的操作]------------------
/**
* 删除单循环链表元素
*/
void LinkListManager::DeleteSingleLoopLinkedList() {
LinkListclass List;
LoopLinkList L;
ElemType e;
int j;
Status i;
i = List.InitList_CL(&L); /* 初始化单循环链表L */
printf("依次在单循环链表中插入3,5\n");
List.ListInsert_CL(&L, 1, 3); /* 在L中依次插入3,5 */
List.ListInsert_CL(&L, 2, 5);
j = List.LocateElem_CL(L, 5, LinkListclass::compare);
if (j)
printf("L的第%d个元素为5。\n", j);
else
printf("不存在值为5的元素\n");
i = List.ListDelete_CL(&L, 2, &e);
printf("删除L的第2个元素:\n");
if (i) {
printf("删除的元素值为%d,现在L中的数据元素依次为:", e);
List.ListTraverse_CL(L, LinkListclass::visit);
} else
printf("删除不成功!\n");
}
/**
* 销毁和清空表
*/
void LinkListManager::DestroyLinkList() {
LinkListclass List;
LoopLinkList L;
ElemType e;
int j;
Status i;
i = List.InitList_CL(&L); /* 初始化单循环链表L */
printf("依次在单循环链表中插入3,5\n");
List.ListInsert_CL(&L, 1, 3); /* 在L中依次插入3,5 */
List.ListInsert_CL(&L, 2, 5);
printf("清空L:%d(1: 成功)\n", List.ClearList_CL(&L));
printf("清空L后,L是否空:%d(1:空 0:否)\n", LinkListclass::ListEmpty_CL(L));
printf("销毁L:%d(1: 成功)\n", List.DestroyList_CL(&L));
}
/**
* 查询元素的前驱和后继
*/
void LinkListManager::GetNextandPrior() {
LinkListclass List;
LoopLinkList L;
ElemType e;
int j;
Status i;
i = List.InitList_CL(&L); /* 初始化单循环链表L */
printf("初始化单循环链表L i=%d (1:初始化成功)\n", i);
i = List.ListEmpty_CL(L);
printf("L是否空 i=%d(1:空 0:否)\n", i);
List.ListInsert_CL(&L, 1, 3); /* 在L中依次插入3,5 */
List.ListInsert_CL(&L, 2, 5);
printf("依次插入元素3和5\n");
List.PriorElem_CL(L, 5, &e); /* 求元素5的前驱 */
printf("5前面的元素的值为%d。\n", e);
List.NextElem_CL(L, 3, &e); /* 求元素3的后继 */
printf("3后面的元素的值为%d。\n", e);
}
/**
* 初始化单循环链表
*/
void LinkListManager::InitLoopList() {
LinkListclass List;
LoopLinkList L;
ElemType e;
int j;
Status i;
i = List.InitList_CL(&L); /* 初始化单循环链表L */
printf("初始化单循环链表L i=%d (1:初始化成功)\n", i);
i = List.ListEmpty_CL(L);
printf("L是否空 i=%d(1:空 0:否)\n", i);
List.ListInsert_CL(&L, 1, 3); /* 在L中依次插入3,5 */
List.ListInsert_CL(&L, 2, 5);
i = List.GetElem_CL(L, 1, &e);
j = List.ListLength_CL(L);
printf("L中数据元素个数=%d,第1个元素的值为%d。\n", j, e);
printf("L中的数据元素依次为:");
List.ListTraverse_CL(L, LinkListclass::visit);
}
/**
* 仅设表尾指针循环链表的合并
*/
void LinkListManager::mergeLoopLinklist() {
LinkListclass List;
int n = 5, i;
LoopLinkList La, Lb;
List.InitList_CL(&La);
for (i = 1; i <= n; i++)
List.ListInsert_CL(&La, i, i);
printf("La="); /* 输出链表La的内容 */
List.ListTraverse_CL(La, LinkListclass::visit);
List.InitList_CL(&Lb);
for (i = 1; i <= n; i++)
List.ListInsert_CL(&Lb, 1, i * 2);
printf("Lb="); /* 输出链表Lb的内容 */
List.ListTraverse_CL(Lb, LinkListclass::visit);
List.MergeList_CL(&La, Lb);
printf("La+Lb="); /* 输出合并后的链表的内容 */
List.ListTraverse_CL(La, LinkListclass::visit);
}
//-------------------[双向链表DuLinkList基本操作]-------------------
/**
* 正序输出双向链表
*/
void LinkListManager::outDuLinkList() {
LinkListclass List;
DuLinkList L;
int i;
List.InitDuList(&L);
for (i = 1; i <= 5; i++)
List.DuListInsert(L, i, i); /* 在第i个结点之前插入i */
printf("正序输出链表:");
List.DuListTraverse(L, LinkListclass::vd); /* 正序输出 */
}
/**
* 逆向输出双向链表
*/
void LinkListManager::reverseoutDuLinkList() {
LinkListclass List;
DuLinkList L;
int i;
List.InitDuList(&L);
for (i = 1; i <= 5; i++)
List.DuListInsert(L, i, i); /* 在第i个结点之前插入i */
printf("逆序输出链表:");
List.ListTraverseBack(L, LinkListclass::vd); /* 逆序输出 */
}
/**
* 双向链表删除元素
*/
void LinkListManager::deleteDuLinkList() {
LinkListclass List;
DuLinkList L;
int i, n = 2;
ElemType e;
List.InitDuList(&L);
printf("初始化链表依次输入1,2,3,4,5\n");
for (i = 1; i <= 5; i++)
List.DuListInsert(L, i, i); /* 在第i个结点之前插入i */
List.DuListDelete(L, n, &e); /* 删除并释放第n个结点 */
printf("删除第%d个结点,值为%d,其余结点为:", n, e);
List.DuListTraverse(L, LinkListclass::vd); /* 正序输出 */
}
/**
* 返回双向链表的长度(即元素个数)
*/
void LinkListManager::getDuLinkListLength() {
LinkListclass List;
DuLinkList L;
int i, n = 2;
ElemType e;
List.InitDuList(&L);
printf("初始化链表依次输入1,2,3,4,5\n");
for (i = 1; i <= 5; i++)
List.DuListInsert(L, i, i); /* 在第i个结点之前插入i */
printf("链表的元素个数为%d\n", List.DuListLength(L));
}
/**
* 双向链表判空
*/
void LinkListManager::judgeDuListEmpty() {
LinkListclass List;
DuLinkList L;
int i, n = 2;
ElemType e;
List.InitDuList(&L);
printf("初始化链表依次输入1,2,3,4,5\n");
for (i = 1; i <= 5; i++)
List.DuListInsert(L, i, i); /* 在第i个结点之前插入i */
printf("链表是否空:%d(1:是 0:否)\n", List.DuListEmpty(L));
List.ClearDuList(L); /* 清空链表 */
printf("清空后,链表是否空:%d(1:是 0:否)\n", List.DuListEmpty(L));
}
/**
* 双向链表元素值的查询
*/
void LinkListManager::GetDuElem() {
LinkListclass List;
DuLinkList L;
int i, n, j;
ElemType e;
List.InitDuList(&L);
printf("初始化链表依次输入1,2,3,4,5\n");
for (i = 1; i <= 5; i++)
List.DuListInsert(L, i, i); /* 在第i个结点之前插入i */
n = 3;
j = List.GetDuElem(L, n, &e); /* 将链表的第n个元素赋值给e */
if (j)
printf("链表的第%d个元素值为%d\n", n, e);
else
printf("不存在第%d个元素\n", n);
}
LinkListManager.h
//
// Created by leoxae on 19-11-6.
//
#ifndef ALGORITHMSLIBRARY_LINKLISTMANAGER_H
#define ALGORITHMSLIBRARY_LINKLISTMANAGER_H
#include "LinkList.h"
class LinkListManager {
public:
//------------------[单链表的操作]------------------
//头插法建立单链表
void headinsertcreateList();
//尾插法建立单链表
void tailinsertcreateList();
//按序号查找单链表
void numGetElem();
//按值查找单链表
void keyGetElem();
//插入元素e到表L
void insertElem();
//从表L中删除元素e
void deleteElem();
//合并两个链表
//------------------[单循环链表的操作]------------------
void mergeList();
//删除单循环链表元素
void DeleteSingleLoopLinkedList();
//销毁和清空表
void DestroyLinkList();
//查询元素的前驱和后继
void GetNextandPrior();
//初始化单循环链表
void InitLoopList();
//仅设表尾指针循环链表的合并
void mergeLoopLinklist();
//-------------------[双向链表DuLinkList基本操作]-------------------
//正序输出双向链表
void outDuLinkList();
//逆向输出双向链表
void reverseoutDuLinkList();
//双向链表删除元素
void deleteDuLinkList();
//返回双向链表的长度(即元素个数)
void getDuLinkListLength();
//双向链表判空
void judgeDuListEmpty();
//双向链表元素值的查询
void GetDuElem();
};
#endif //ALGORITHMSLIBRARY_LINKLISTMANAGER_H
[数据结构]链表相关的实现LinkList.cpp的更多相关文章
- c数据结构 顺序表和链表 相关操作
编译器:vs2013 内容: #include "stdafx.h"#include<stdio.h>#include<malloc.h>#include& ...
- 数据结构和算法(Golang实现)(12)常见数据结构-链表
链表 讲数据结构就离不开讲链表.因为数据结构是用来组织数据的,如何将一个数据关联到另外一个数据呢?链表可以将数据和数据之间关联起来,从一个数据指向另外一个数据. 一.链表 定义: 链表由一个个数据节点 ...
- Redis数据结构—链表与字典的结构
目录 Redis数据结构-链表与字典的结构 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 Redis字典的使用 Re ...
- Redis数据结构—链表与字典
目录 Redis数据结构-链表与字典 链表 Redis链表节点的结构 Redis链表的表示 Redis链表用在哪 字典 Redis字典结构总览 Redis字典结构分解 哈希算法 解决键冲突 rehas ...
- [LeetCode] [链表] 相关题目总结
刷完了LeetCode链表相关的经典题目,总结一下用到的技巧: 技巧 哑节点--哑节点可以将很多特殊case(比如:NULL或者单节点问题)转化为一般case进行统一处理,这样代码实现更加简洁,优雅 ...
- Python—数据结构——链表
数据结构——链表 一.简介 链表是一种物理存储上非连续,数据元素的逻辑顺序通过链表中的指针链接次序,实现的一种线性存储结构.由一系列节点组成的元素集合.每个节点包含两部分,数据域item和指向下一个节 ...
- (js描述的)数据结构[链表](4)
(js描述的)数据结构 [链表](4) 一.基本结构 二.想比于数组,链表的一些优点 1.内存空间不是必须连续的,可以充分利用计算机的内存,事项灵活的内存动态管理. 2.链表不必再创建时就确定大小,并 ...
- 数据结构(C语言版)链表相关操作算法的代码实现
这次实现的是带头结点的单链表的初始化.遍历.创建.插入.删除.判断链表是否为空.求链表长度函数,编译环境是vs2013. 其中插入和删除函数中循环的条件目前还不太明白. #include<ios ...
- [数据结构]链表LinkList
目录 1.3 链表 1.3.1 头插法建立单链表 1.3.2 限制链表长度建立单链表 1.3.3 尾插法建立单链表 1.3.4 按序号查找单链表 1.3.5 按值查找单链表 1.3.6 链表的插入 1 ...
随机推荐
- Kafka入门教程(一)
转自:https://blog.csdn.net/yuan_xw/article/details/51210954 1 Kafka入门教程 1.1 消息队列(Message Queue) Messag ...
- Python3的类注意事项
参考: https://www.runoob.com/python/python-object.html https://www.runoob.com/w3cnote/python-extends-i ...
- LeetCode1579题——圆圈中最后剩下的数字
1.题目描述:0,1,,n-1这n个数字排成一个圆圈,从数字0开始,每次从这个圆圈里删除第m个数字.求出这个圆圈里剩下的最后一个数字.例如,0.1.2.3.4这5个数字组成一个圆圈,从数字0开始每次删 ...
- DP-Burst Balloons
leetcode312: https://leetcode.com/problems/burst-balloons/#/description Given n balloons, indexed fr ...
- go recover让崩溃的程序继续执行
package main import ( "fmt" "log" ) func de() { //recover() //可以打印panic的错误信息 //f ...
- SpringMVC responseBody注解分析
@responsebody表示该方法的返回结果直接写入HTTP response body中一般在异步获取数据时使用,在使用@RequestMapping后,返回值通常解析为跳转路径,加上@respo ...
- Hadoop生态圈学习-1(理论基础)
一.大数据技术产生的背景 1. 计算机和信息技术(尤其是移动互联网)的迅猛发展和普及,行业应用系统的规模迅速扩大(用户数量和应用场景,比如facebook.淘宝.微信.银联.12306等),行业应用所 ...
- java 整型
byte(1字节).short(2字节).int(4字节).long(16字节) java中前缀加上0b或者0B就可以写二进制数,前缀加上0就可以写八进制数,前缀加上0x或者0X就可以写十六进制数 一 ...
- ANTLR 简介
<ANTLR 4权威指南>由机械工业出版社出版,有兴趣的读者推荐购买阅读. 本专题大多内容来源于我读<ANTLR 4权威指南>的随手笔记以及个人实践,仅供参考学习,请勿用于任何 ...
- Mysql从头部署多个版本
目录 一.环境准备 二.下载安装包 三.Mysql-5.6单独部署 四.Mysql-5.7单独部署 五.添加到多版本控制 六.muliti使用 一.环境准备 系统:centos7.3一台 软件版本:m ...