王道数据结构:带头结点的单链表基本操作

#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include<stdio.h>

using namespace std;

typedef struct LNode {
	int data;
	struct LNode *next;
}LNode,*LinkList;
//LNode 强调节点
//LinkList 强调链表

bool InitList(LinkList &L) {//初始化
	L = (LNode*)malloc(sizeof(LNode));//分配一个头结点
	if (L==NULL)//分配失败
	{
		return false;
	}
	L->next = NULL;
	return true;
}

bool Empty(LinkList L) {//判空
	if (L->next==NULL)
	{
		return true;
	}
	else
	{
		return false;
	}
}

int Length(LinkList L) {//统计长度
	int len = 0;
	LNode* p = L;
	while (p->next)
	{
		len++;
		p = p->next;
	}
	return len;
}

LNode* GetElem(LinkList L, int i) {//按位查找
	if (i < 0) {
		return NULL;
	}
	int j = 0;
	LNode *p = L;
	while (p!=NULL&&j<i)
	{
		p = p->next;
		j++;
	}
	return p;
}

LNode* LocateElem(LinkList L, int e) {//按值查找,找到数据域等于e的节点
	LNode *p = L->next;
	while (p!=NULL&&p->data!=e)
	{
		p = p->next;
	}
	return p;
}

bool InsertNextNode(LNode*p, int e) {//后插操作,在节点p之后插入元素e
	if (p == NULL) {//没有p节点
		return false;
	}
	LNode *s = (LNode*)malloc(sizeof(LNode));
	if (s==NULL)//内存分配失败
	{
		return false;
	}
	s->data = e;
	s->next = p->next;//令新节点s的指针域指向p的后继节点
	p->next = s;//令节点p的指针指向新插入的节点s
	return true;
}

bool InsertPriorNode(LNode* p, int e) {//前插操作,在节点p之前插入元素e
	{
		if (p == NULL) {//没有p节点
			return false;
		}
		LNode *s = (LNode*)malloc(sizeof(LNode));
		if (s == NULL)//内存分配失败
		{
			return false;
		}
		s->next = p->next;//修改指针域 把s的后继节点修改为p的后继节点
		p->next = s;//令节点p的指针指向新插入的节点s
		s->data == p->data;//p节点的值赋给s节点
		p->data = e;//新元素赋给p节点
		return true;
	}
}

LinkList List_HeadInsert(LinkList &L) {//头插法建立单链表输入:1 2 3输出: 3 2 1
	LNode* s;
	int x;
	L = (LinkList)malloc(sizeof(LNode));//创始头结点
	L->next = NULL;//初始为空链表
	cin >> x;
	while (x != 9999)
	{
		s = (LNode*)malloc(sizeof(LNode));//创建新节点
		s->data = x;
		s->next = L->next;//新节点插入表中,L为头指针 
		L->next = s;
		cin >> x;
	}
	return L;
}

LinkList List_TailInsert(LinkList& L) {//尾插法建立单链表
	L = (LinkList)malloc(sizeof(LNode));
	L->next = NULL;
	LNode* s, *r = L;	//r表示表尾指针
	int x;
	cin >> x;
	while (x!=9999) {
		s = (LNode*)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;
		r = s;	//r指向新的表尾节点
		cin >> x;
	}
	r->next = NULL;	//尾结点指针置空
	return L;
}

bool ListInsert(LinkList& L,int i,int e) {//按位序插入,在第i个位置插入元素e
	if (i < 1) {
		return false;
	}
	LNode *p = GetElem(L, i - 1);
	if (p == NULL) {
		return false;
	}
	return InsertNextNode(p, e);
}

bool ListDelete(LinkList& L, int i, int& e) {//删除位序i的节点,e是i节点的值
	if (i<1)
	{
		return false;
	}
	LNode*p = GetElem(L, i - 1);
	if (p == NULL || (p->next) == NULL) {
		return false;
	}
	LNode* q = p->next;
	e = q->data;
	p->next = q->next;
	free(q);
	return true;
}

//删除指定节点P
bool DeleteNode(LNode* p) {
	if (p->next == NULL) return false;
	//下面这段代码有bug,不能删除最后一个节点,因此要是删除最后一个节点的话要重新进行操作
	LNode* q = p->next;
	p->data = q->data;
	p->next = q->next;
	free(q);
	return true;
}


void Print(LinkList L) {
	LNode *s = L;
	while (s->next!=NULL)
	{
		s = s->next;
		cout << s->data << " ";
	}
	cout << endl;
}
	int main(){
		LinkList L;
		List_TailInsert(L);
		cout << "尾插法:" << endl;
		Print(L);
		cout << "链表的第3个元素:" << GetElem(L, 3)->data << endl;
		cout << "链表的长度:" << Length(L)<< endl;
		int e;
		ListDelete(L, 4, e);
		cout << "删除的第4个元素是:" << e << endl;
		cout << "当前链表:" << endl;
		Print(L);
		ListInsert(L, 3, e);
		cout << "插入的第3个元素是:" << e << endl;
		Print(L);
	}








  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
王道数据结构VIP思维导图是一种整理和梳理数据结构知识的工具,能够帮助学习者更好地理解和掌握数据结构的重要概念和关键知识点。 王道数据结构VIP思维导图主要包含以下几个部分: 1. 数据结构基础:介绍了数据结构的概念、分类和基本术语,包括线性结构、树结构、图结构等,通过思维导图的形式,清晰地呈现出各种结构的特点和应用场景。 2. 数组和字符串:详细介绍了数组和字符串的相关概念、操作和应用,包括数组的定义、插入和删除操作,字符串的匹配、替换和翻转等。 3. 栈和队列:探讨了栈和队列的定义、基本操作和实际应用,比如栈的压入弹出操作、队列的入队出队操作,以及使用栈和队列解决实际问题的例子。 4. 链表和树:介绍了链表和树的基本知识和常见操作,包括单链表、双向链表的插入和删除操作,二叉树的遍历和搜索算法等。 5. 图和查找:讲解了图和查找算法的相关知识,例如图的表示方法、深度优先搜索和广度优先搜索算法,查找算法中的顺序查找和二分查找等。 6. 排序和算法设计:涵盖了各种排序算法的原理和实现,如冒泡排序、选择排序、插入排序、快速排序等,以及常用的算法设计思想,如递归、贪心算法、分治算法和动态规划等。 王道数据结构VIP思维导图通过图文结合的方式,清晰地展现了数据结构的层次结构和知识点之间的关联性,能够帮助学习者系统地学习和记忆数据结构的重要内容。同时,思维导图的形式也方便学习者在复习阶段快速回顾知识点,加深对数据结构的理解和应用能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值