ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

链表学习

2020-05-01 11:58:29  阅读:224  来源: 互联网

标签:学习 return index next 链表 false LinkList


链表学习(单链表)

链表的原理

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

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 << "\t";
		p = p->next;
	}

}

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

标签:学习,return,index,next,链表,false,LinkList
来源: https://www.cnblogs.com/Ybossy/p/12813011.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有