#pragma once
#include <cstdlib>
#include <iostream>
using namespace std;
#define MAXSIZE 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -1
typedef int Status;
typedef char ElementType;
typedef struct LNode {
ElementType data;
struct LNode* next;
}LNode, * LinkList;
//头插法
void createList_H(LinkList& L, int n) {
L = new LNode;
L->next = NULL;
for (int i = 0; i < n; i++) {
LinkList p = new LNode;
cin >> p->data;
p->next = L->next;
L->next = p;
}
}
//尾插法
void createList_R(LinkList& L, int n) {
L = new LNode;
L->next = NULL;
LinkList r = L;
for (int i = 0; i < n; i++) {
LinkList p = new LNode;
cin >> p->data;
p->next = NULL;
r->next = p;
r = p;
}
}
Status initList_L(LinkList& L) {
L = new LNode;
L->next = NULL;
return OK;
}
int listEmpty_L(LinkList L) {
if (L->next) {
return 0;
}
else
{
return 1;
}
}
Status destoryList_L(LinkList& L) {
LinkList p;
while (L) {
p = L;
L = L->next;
delete p;
}
return OK;
}
Status clearList_L(LinkList& L) {
LinkList p, q;
p = L->next;
//头节点指针域为NULL
L->next = NULL;
while (p) {
q = p;
p = p->next;
delete q;
}
return OK;
}
int listLength_L(LinkList L) {
LinkList p;
p = L->next;
int i = 0;
while (p) {
i++;
p = p->next;
}
return i;
}
Status getElem_L(LinkList L, int i, ElementType& e) {
LinkList p = L->next;
int j = 1;
while (p && j < i) {
p = p->next;
j++;
}
//第i个元素不存在
if (!p || j > i) {
return ERROR;
}
e = p->data;
return OK;
}
LinkList locateElem_L(LinkList L, ElementType e) {
LinkList p = L->next;
while (p && p->data != e) {
p = p->next;
}
//找到,返回L中值为e的数据元素的地址;查找失败返回NULL
return p;
}
//在L中第i个元素之前插入e
Status listInsert_L(LinkList& L, int i, ElementType e) {
LinkList p = L;
int j = 0;
//寻找第i-1个结点,p指向i-1结点
while (p && j < i - 1) {
p = p->next;
j++;
}
//i值不合法
if (j > i || !p) {
return ERROR;
}
LinkList q = new LNode;
q->data = e;
q->next = p->next;
p->next = q;
return OK;
}
Status listDelete_L(LinkList& L, int i, ElementType& e) {
LinkList p = L;
int j = 0;
//寻找第i个结点,并令p指向其前驱
while (p->next && j < i - 1) {
p = p->next;
j++;
}
//i值非法
if (!p->next || j > i - 1) {
return ERROR;
}
LinkList q = p->next;
e = q->data;
p->next = q->next;
delete q;
return OK;
}
//带尾指针循环链表的合并
//假设Ta,Tb都是非空的单循环链表
LinkList connect(LinkList Ta, LinkList Tb) {
//p存表头结点
LinkList p = Ta->next;
//Tb表头连接Ta表尾
Ta->next = Tb->next->next;
//释放Tb表头结点
delete Tb->next;
//Tb表尾连接Ta表头结点
Tb->next = p;
return Tb;
}
单链表、循环链表
猜你喜欢
转载自blog.csdn.net/Warmmm/article/details/112840946
今日推荐
周排行