单链表原理
单链表是一种线性结构,逻辑相邻的元素在内存中可以不相邻,他的存储大小不固定,对于插入和删除操作十分方便。
结构体定义
typedef struct LinkList
{
int data;
struct LinkList* next;
}LinkList, LinkNode;
单链表代码实现
初始化
typedef struct LinkList
{
int data;
struct LinkList* next;
}LinkList, LinkNode;
//初始化
bool initLink(LinkList*& L)
{
L = new LinkList;
if (!L) return false;
L->next = NULL;
L->data = 0;
return true;
}
三种插入方式
前插法
将元素插入到头结点下一个
bool insert_front(LinkList*& L, int val)
{
if (!L) return false;
LinkNode* node = new LinkNode;
node->data = val;
node->next = L->next;
L->next = node;
return true;
}
尾插法
将元素插入到单链表尾部
bool insert_back(LinkList*& L, int val)
{
if (!L) return false;
LinkNode* node = new LinkNode;
node->data = val;
node->next = NULL;
LinkNode* p = L->next;
while (p->next)
{
p = p->next;
}
p->next = node;
return true;
}
在任意位置插入
将元素插入到任意位置,断开原有的连接,再将插入元素重新连接
bool insertLink(LinkList*& L, int index, int val)
{
if (!L || index <= 0) return false;
int j = 0;
LinkNode* p = L;
while (p->next && j < index - 1)
{
p = p->next;
j++;
}
if (!p) return false;
LinkNode* node = new LinkNode;
node->data = val;
node->next = p->next;
p->next = node;
return true;
}
删除
该删除方式使用的是删除某个位置元素,也可以修改为删除指定元素
bool deleteLink(LinkList*& L, int index)
{
if (!L || index < 1) return false;
int j = 0;
LinkNode* p = L;
while (p->next && j < index - 1)
{
p = p->next;
j++;
}
if (!p) return false;
LinkNode* q = p->next;
p->next = q->next;
delete q;
return true;
}
查找
bool findLink(LinkList*& L, int val)
{
if (!L) return false;
LinkNode* p = L->next;
while (p)
{
if (p->data == val)
{
return true;
}
p = p->next;
}
return false;
}
打印与销毁
对于链表需要用到一个节点指针p来对整个链表进行遍历和操作
//销毁
void destoryLink(LinkList*& L)
{
if (!L) return;
LinkNode* p;
p = L;
while (p)
{
L = L->next;
delete p;
p = L;
}
}
//打印信息
void printLink(LinkList*& L)
{
if (!L) return;
LinkNode* p;
p = L->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
完整代码(简单测试)
#include <iostream>
using namespace std;
typedef struct LinkList
{
int data;
struct LinkList* next;
}LinkList, LinkNode;
//初始化
bool initLink(LinkList*& L)
{
L = new LinkList;
if (!L) return false;
L->next = NULL;
L->data = 0;
return true;
}
//销毁
void destoryLink(LinkList*& L)
{
if (!L) return;
LinkNode* p;
p = L;
while (p)
{
L = L->next;
delete p;
p = L;
}
}
//打印信息
void printLink(LinkList*& L)
{
if (!L) return;
LinkNode* p;
p = L->next;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
//前插法
bool insert_front(LinkList*& L, int val)
{
if (!L) return false;
LinkNode* node = new LinkNode;
node->data = val;
node->next = L->next;
L->next = node;
return true;
}
//尾插法
bool insert_back(LinkList*& L, int val)
{
if (!L) return false;
LinkNode* node = new LinkNode;
node->data = val;
node->next = NULL;
LinkNode* p = L->next;
while (p->next)
{
p = p->next;
}
p->next = node;
return true;
}
//插入
bool insertLink(LinkList*& L, int index, int val)
{
if (!L || index <= 0) return false;
int j = 0;
LinkNode* p = L;
while (p->next && j < index - 1)
{
p = p->next;
j++;
}
if (!p) return false;
LinkNode* node = new LinkNode;
node->data = val;
node->next = p->next;
p->next = node;
return true;
}
//删除
bool deleteLink(LinkList*& L, int index)
{
if (!L || index < 1) return false;
int j = 0;
LinkNode* p = L;
while (p->next && j < index - 1)
{
p = p->next;
j++;
}
if (!p) return false;
LinkNode* q = p->next;
p->next = q->next;
delete q;
return true;
}
//查找
bool findLink(LinkList*& L, int val)
{
if (!L) return false;
LinkNode* p = L->next;
while (p)
{
if (p->data == val)
{
return true;
}
p = p->next;
}
return false;
}
int main(void)
{
LinkList* L;
initLink(L);
cout << "前插法 5 6 7" << endl;
insert_front(L, 5);
insert_front(L, 6);
insert_front(L, 7);
printLink(L);
cout << "尾插法 5 6 7" << endl;
insert_back(L, 5);
insert_back(L, 6);
insert_back(L, 7);
printLink(L);
cout << "在第五个位置插入10" << endl;
insertLink(L, 5, 10);
printLink(L);
cout << "删除第2个" << endl;
deleteLink(L, 2);
printLink(L);
cout << "查找1和10" << endl;
if (findLink(L, 1))
{
cout << "找到1了" << endl;
}
else
{
cout << "找不到1" << endl;
}
if (findLink(L, 10))
{
cout << "找到10了" << endl;
}
else
{
cout << "找不到10" << endl;
}
destoryLink(L);
return 0;
}