单链表

37 阅读2分钟
#include<iostream>
using namespace std;

#define  ElemType int

//不带头结点的单链表
typedef struct LNode
{
	ElemType data;
	struct LNode* next;
}LNode,*LinkList;

//单链表的初始化
bool InitList(LinkList& L)
{
	L = NULL;
	return true;
}

//判断链表是否为空
bool empty(LinkList L)
{
	return (L == NULL);
}
//不带头结点的插入操作,要对第一个位置特殊处理
bool ListInsert(LinkList& L, int i, ElemType e) {
	if (i < 1)
	{
		return false;
	}
	LNode* s = (LNode*)malloc(sizeof(LNode));
	s->data = e;
	if (i == 1)
	{
		s->next = L;
		L = s;//更新第一个结点
		return true;
	}
	LNode* p;
	int j = 1;
	p = L;
	while (p != NULL && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (p == NULL) {
		return false;
	}
	s->next = p->next;
	p->next = s;
	return true;
}

//对给定结点进行前插操作
//后插操作特别简单,但是前插我们无法知道该结点前面的结点所有要先后插在把两个结点的值调换
bool InsertPriorNode(LNode* p, ElemType e)
{
	if (p == NULL)
	{
		return false;
	}
	LNode* s = (LNode*)malloc(sizeof(LNode));
	if (s == NULL)
	{
		return false;
	}
	s->next = p->next;
	p->next = s;
	s->data = p->data;
	p->data = e;
	return true;
}

//带头结点的单链表
typedef struct LNode
{
	ElemType data;
	struct LNode* next;
}LNode, * LinkList;

//初始化
bool InitList2(LinkList& L)
{
	L = (LNode*)malloc(sizeof(LNode));
	if (L == NULL)//判断是否创建成功
	{
		return false;
	}
	L->next = NULL;
	return true;
}

//判断是否为空
bool empty1(LinkList L) {
	return (L->next == NULL);
}

//按位插入
bool ListInsert1(LinkList& L, int i, ElemType e)//在第i个位置插入e
{
	if (i < 1) return false;
	LNode* p = L;
	int j = 0;
	//寻找第i-1个结点
	while (p != NULL && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (p == NULL)return false;
	LNode* s = (LNode*)malloc(sizeof(LNode));
	s->data = e;
	s->next = p->next;
	p->next = s;
	return true;
}

//按位序删除
bool ListDelete(LinkList& L, int i, ElemType& e)
{
	if (i < 1)
	{
		return false;
	}
	LNode* p;
	int j = 0;
	p = L;
	while (p != NULL && j < i - 1)
	{
		p = p->next;
		j++;
	}
	if (p == NULL&&p->next==NULL)
	{
		return false;
	}
	LNode* q = p->next;
	e = q->data;
	p->next = q->next;
	free(p);
	return true;
}

//删除指定结点
//同理先把下一个结点的值赋给该结点再删除后一结点
bool DeleteNode(LNode* p) {
	if (p == NULL) {
		return false;
	}
	LNode* q = p->next;
	p->data = p->next->data;
	p->next = q->next;
	free(q);
	return true;
}