链表学习

Posted ybossy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了链表学习相关的知识,希望对你有一定的参考价值。

链表学习(单链表)

链表的原理

链表是线性表的链式存储方式,逻辑上相邻的数据在计算机内的存储位置不一定相邻,那么如何表示逻辑上的相邻关系呢,我们可以给每一个元素附加一个指针域,用来
指向下一个元素的存储位置。

1.每个节点由指针域跟数据域组成
2.指针域中存储的指针指向下一个元素的地址
其结构体定义如下:

typedef struct Node{
	int data;
	Node* next;
}LinkList,LinkNode;
//LinkList:表头 ListNode:节点

链表的算法实现

链表的初始化

bool ListInit(LinkList*& L) {
	L = new LinkList;
	if (!L) return false;//初始化失败
	L->next = NULL;
	L->data = -1;
	return true;
}

在链表的头部插入数据

bool addListFront(LinkList* &L,LinkNode* &N) {//插入的数据在链表前面
	if (!L || !N) {
		cout << "插入失败!" << endl;
		return false;
	}
	N->next = L->next;
	L->next = N; 
	return true;
}

在链表的尾部插入数据

bool addListEnd(LinkList*& L, LinkNode*& N) {//插入在最后面
	if (!L || !N) {
		cout << "插入失败!" << endl;
		return false;
	}
	LinkList* last = NULL;
	last = L;
	while (last->next)    last = last->next;
	last->next = N;
	N->next = NULL;
	return true;
}

在链表的任意处插入数据,e作为链表第index个元素的数据

bool insertList(LinkList*& L, int index,int e) {
	if (!L) {
		return false;
	}
	LinkNode* N = new LinkNode;
	N->data = e;
	LinkList* nodeI = L;
	int count = 0;
	while (nodeI->next&&count<index-1) {
		nodeI = nodeI->next;
		count++;
	}
	if (!nodeI||count>index-1) {//!nodeI时表示index的值传入过大,count>=index-1时表示传入的index是非正数
		return false;
	}
	N->next = nodeI->next;
	nodeI->next = N;
	return true;
}

链表查找第 index个元素的值,并存储在e里面

bool listGetElem(LinkList*& L, int index, int& e) {
	if (!L) {
		return false;
	}
	else if (!L->next) {
		return false;
	}
	LinkNode* p = L->next;
	int count = 1;
	while (p&&count<index){
		p = p->next;
		count++;
	}
	if (!p || count > index) {
		return false;
	}
	e = p->data;
	return true;
}

查找链表L里面是否有值为e的元素并且将序号返回到index

bool listHadElem(LinkList*& L, int e, int& index) {
	if (!L || !L->next) {
		index = 0;
		return false;
	}
	index = 1;
	LinkNode* p = L->next;
	while (p&&p->data!=e) {
		p = p->next;
		index++;
	}
	if (!p) {
		return false;
	}//没有这个值
	return true;
}

删除L中第index个元素

bool LinkDelete(LinkList*&L,int index){
	if (!L) {
		return false;
	}
	else if (!L->next) {
		//cout << "链表中没有元素!" << endl;
		return false;
	}
	LinkNode* p = L;
	int count = 0;
	while (p && count < index-1) {
		p = p->next;
		count++;
	}
	if (!p || count > index-1) {
		//cout << "查找失败!" << endl;
		return false;
	}
	LinkNode* node = p->next;
	if (!node) return false;
	p->next = node->next;
	delete node;
	return true;
}

干掉整个链表

bool LinkDestroy(LinkList*& L) {
	if (!L) {
		return false;
	}
	LinkNode* p1 = L;
	while (p1) {
		L=L->next;
		cout << "删除元素:" << p1->data << endl;
		delete p1;
		p1 = L;//最后L=NULL了 是因为中间把L->next的值赋给了L
	}
	return true;
}

遍历L中每一个元素的数据

void printL(LinkList* &L) {
	if (!L|| !L->next) {
		cout << "链表中不存在元素,或不存在此链表" << endl;
		return;
	}
	LinkNode* p = L->next;
	while(p) {
		cout << p->data << "	";
		p = p->next;
	}

}

以上就是我对于单链表的学习内容

以上是关于链表学习的主要内容,如果未能解决你的问题,请参考以下文章

IOS开发-OC学习-常用功能代码片段整理

NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段

java SpringRetry学习的代码片段

python 机器学习有用的代码片段

学习笔记:python3,代码片段(2017)

学习 PyQt5。在我的代码片段中找不到错误 [关闭]