链表学习
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;
}
}
以上就是我对于单链表的学习内容
以上是关于链表学习的主要内容,如果未能解决你的问题,请参考以下文章
NC41 最长无重复子数组/NC133链表的奇偶重排/NC116把数字翻译成字符串/NC135 股票交易的最大收益/NC126换钱的最少货币数/NC45实现二叉树先序,中序和后序遍历(递归)(代码片段