单链表、循环链表

#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