单链表的使用一应俱全
(欢迎提出问题,意见)
1.链表的定义:
typedef struct _LinkNode{
int data; //结点的数据域
struct _LinkNode *next; //链表结点,链表
}LinkNode ,LinkList; //链表结点,链表
2.链表的初始化
bool InitList(LinkList* &L){ //构造一个空的单链表L
L=new LinkNode; //生成新的结点作为头结点,用头指针L指向头结点
if(!L)return false; //生成结点失败
L->next=NULL; //头结点的指针域置空
L->data=-1;
return true;
}
3.链表的前插法(两种版本):
1
//前插法
bool ListInsert_font(LinkList*& L, int e) {
LinkNode* s;
if (!L) return false;
s = new LinkNode;
s->data = e;
s->next = L->next;
L->next = s;
return true;
}
2是插入一个结点
//前插法
bool ListInsert_font(LinkList* &L,LinkNode * node){
if(!L||!node)return false;
node->next=L->next;
L->next=node;
return true;
}
4.尾插法:(两种版本)
1.
//尾插法
bool ListInsert_back(LinkList*& L, int e) {
LinkNode* last = NULL;
LinkNode* s;
if (!L) return false;
last = L;
while (last->next) last = last->next;
s = new LinkNode;
s->data = e;
s->next = NULL;
last->next = s;
return true;
}
2:是插入一个结点
//尾插发
bool ListInsert_back(LinkList *&L,LinkNode *node){
LinkNode* last = NULL;
if(!L||!node)return false;
//找到最后一个节点
last = L;
while(last->next) last=last->next;
//新的结点链接到尾部
node->next=NULL;
last->next=node;
return true;
}
5.指定位置的插入
//指定位置的插入
bool LinkInsert(LinkList*& L, int i, int& e) {
if (!L)return false;
int j=0;
LinkList* p, * s;
p = L;
while (p && j < i - 1) //查找第 i-1 个结点,p 指向该结点
{
p = p->next;
j++;
}
if (!p || j > i - 1) {//i>n+1 或者 i<1
return false;
}
s = new LinkNode; //生成新结点
s->data=e; //将新结点的数据域置为 e
s->next = p->next; //将新结点的指针域指向结点 ai
p->next=s; //将结点 p 的指针域指向结点 s
return true;
}
6.单链表的取值
bool Link_GetElem(LinkList*& L, int i, int& e)//单链表的取值
{
int j;
LinkList* p;
if (!L || !L->next) return false;
p = L->next;//p 指向第一个结点,
j=1; //j 为计数器
while (j < i && p) {
p = p->next;
j++;
}
if (!p || j > i) {
return false;
}
e = p->data;
return true;
}
7.按值查找
bool Link_FindElem(LinkList* L, int e,int &index) //按值查找 index为位置
{
LinkList* p;
p = L->next;
index = 1;
while (p && p->data != e) {
p = p->next;
index++;
}
if (!p) {
index = 0;
return false;
}
return true;
}
8.单链表的删除
bool LinkDelete(LinkList*& L, int i) //单链表的删除
{
//在带头结点的单链表 L 中,删除第 i 个位置
LinkList *p, *q;
int j;
p = L;
j = 0;
if (!L || !L->next) { //合法性检查
return false;
}
while ((p->next) && (j < i - 1)) //查找第 i-1 个结点,p 指向该结点
{
p = p->next;
j++;
}
if (!(p->next) || (j > i - 1))//当 i>n 或 i<1 时,删除位置不合理
return false;
q = p->next; //临时保存被删结点的地址以备释放空间
p->next = q->next; //改变删除结点前驱结点的指针域
delete q; //释放被删除结点的空间
return true;
}
9.单链表的销毁
void LinkDestroy(LinkList*& L) //单链表的销毁;
{
LinkList* p = L;
cout << "销毁链表!" << endl;
while (p) {
L = L->next; //L 指向下一个节点
cout << "删除元素: " << p->data << endl;
delete p; //删除当前节点
p=L; //p 移向下一个节点
}
}
10.单链表的遍历
void LinkPrint(LinkList*& L) {
LinkNode* p = NULL;
if (!L) {
cout << "链表为空" << endl;
return;
}
p = L->next;
while (p){
cout << p->data << "\t";
p = p->next;
}
cout << endl;
}
用下面代码可以进行验证
#include <iostream>
using namespace std;
int main(void) {
LinkList* L = NULL;
LinkList* s = NULL;
//1.初始化一个空的链表
InitList(L);
//2.使用前插法插入数据
int n;
int e=0;
cout << "前插法创建单链表" << endl;
cout << "请输入元素的个数n" << endl;
cin >> n;
cout << "请依次输入n个元素的个数: "<< endl;
for (int i = 0; i < n; i++) {
cin >> e;
ListInsert_font(L, e);
}
LinkPrint(L);
//3.使用尾插法插入数据
//int n;
cout << "尾插法创建单链表" << endl;
cout << "请输入元素的个数n" << endl;
cin >> n;
cout << "请依次输入n个元素的个数: " << endl;
for(int i=0;i<n;i++){
cin >> e;
ListInsert_back(L, e);
}
//4.单链表的输出
LinkPrint(L);
//5.任意位置插入元素
for (int j = 0; j < 3; j++) {
int i, x;
cout << "请输入插入的位置和元素:";
cin >> i >> x;
if (LinkInsert(L, i, x)) {
cout << "插入成功" << endl;
}else {
cout << "插入失败" << endl;
}
LinkPrint(L);
}
//6.根据位置获取元素
int element = 0;
if (Link_GetElem(L, 2, element)) {
cout << "获取第二个元素成功,值: " << element << endl;
}
else {
cout << "获取第二个元素失败" << endl;
}
//7.单链表根据值查询所在的位置
int index = 0;
if (Link_FindElem(L, 10, index)) {
cout << "查找元素10存在,所在位置: " << index << endl;
}
else {
cout << "不存在元素 10" << endl;
}
//8.删除元素
if (LinkDelete(L, 2)) {
cout << "删除第二个元素" << endl;
LinkPrint(L);
}
else {
cout << "删除第二个元素失败" << endl;
}
//9.单链表销毁
LinkDestroy(L);
system("pause");
return 0;
}
在任意位置进行插入
前插法
尾插发
#include <iostream>
using namespace std;
//单链表的初始化
typedef struct _LinkNode {
int data;//结点的数据域
struct _LinkNode* next;//结点的指针域
}LinkNode,LinkList;//链表节点、链表
bool InitList(LinkList*& L) {
L = new LinkNode;
if (!L)return false;//生成结点失败
L->next = NULL;
L->data = -1;
return true;
}
//前插法
bool ListInsert_font(LinkList*& L, LinkNode* node) {
if (!L || !node) return false;
node->next = L->next;
L->next = node;
return true;
}
//后插法
bool ListInsert_back(LinkList*& L, LinkNode* node) {
LinkNode* last = NULL;
if (!L || !node) return false;
last = L;
while (last->next) last = last->next;
node->next = NULL;
last->next = node;
return true;
}
//指定位置的插入
bool LinkInsert(LinkList*& L, int i, int& e) {
if (!L)return false;
int j=0;
LinkList* p, * s;
p = L;
while (p && j < i - 1) //查找第 i-1 个结点,p 指向该结点
{
p = p->next;
j++;
}
if (!p || j > i - 1) {//i>n+1 或者 i<1
return false;
}
s = new LinkNode; //生成新结点
s->data=e; //将新结点的数据域置为 e
s->next = p->next; //将新结点的指针域指向结点 ai
p->next=s; //将结点 p 的指针域指向结点 s
return true;
}
bool Link_GetElem(LinkList*& L, int i, int& e)//单链表的取值
{
int j;
LinkList* p;
if (!L || !L->next) return false;
p = L->next;//p 指向第一个结点,
j=1; //j 为计数器
while (j < i && p) {
p = p->next;
j++;
}
if (!p || j > i) {
return false;
}
e = p->data;
return true;
}
bool Link_FindElem(LinkList* L, int e,int &index) //按值查找 index为位置
{
LinkList* p;
p = L->next;
index = 1;
while (p && p->data != e) {
p = p->next;
index++;
}
if (!p) {
index = 0;
return false;
}
return true;
}
bool LinkDelete(LinkList*& L, int i) //单链表的删除
{
//在带头结点的单链表 L 中,删除第 i 个位置
LinkList *p, *q;
int j;
p = L;
j = 0;
if (!L || !L->next) { //合法性检查
return false;
}
while ((p->next) && (j < i - 1)) //查找第 i-1 个结点,p 指向该结点
{
p = p->next;
j++;
}
if (!(p->next) || (j > i - 1))//当 i>n 或 i<1 时,删除位置不合理
return false;
q = p->next; //临时保存被删结点的地址以备释放空间
p->next = q->next; //改变删除结点前驱结点的指针域
delete q; //释放被删除结点的空间
return true;
}
void LinkDestroy(LinkList*& L) //单链表的销毁;
{
LinkList* p = L;
cout << "销毁链表!" << endl;
while (p) {
L = L->next; //L 指向下一个节点
cout << "删除元素: " << p->data << endl;
delete p; //删除当前节点
p=L; //p 移向下一个节点
}
}
void LinkPrint(LinkList*& L) {
LinkNode* p = NULL;
if (!L) {
cout << "链表为空" << endl;
return;
}
p = L->next;
while (p){
cout << p->data << "\t";
p = p->next;
}
cout << endl;
}
int main(void) {
LinkList* L = NULL;
LinkList* s = NULL;
//1.初始化一个空的链表
InitList(L);
//2.使用前插法插入数据
int n;
cout << "前插法创建单链表" << endl;
cout << "请输入元素的个数n" << endl;
cin >> n;
cout << "请依次输入n个元素的个数: "<< endl;
while (n > 0) {
s = new LinkNode;//生成新结点s
cin >> s->data;
ListInsert_font(L, s);
n--;
}
//3.使用尾插法插入数据
//int n;
cout << "尾插法创建单链表" << endl;
cout << "请输入元素的个数n" << endl;
cin >> n;
cout << "请依次输入n个元素的个数: " << endl;
while (n > 0) {
s = new LinkNode;//生成新结点s
cin >> s->data;
ListInsert_back(L, s);
n--;
}
//4.单链表的输出
LinkPrint(L);
//5.任意位置插入元素
for (int j = 0; j < 3; j++) {
int i, x;
cout << "请输入插入的位置和元素:";
cin >> i >> x;
if (LinkInsert(L, i, x)) {
cout << "插入成功" << endl;
}else {
cout << "插入失败" << endl;
}
LinkPrint(L);
}
//6.根据位置获取元素
int element = 0;
if (Link_GetElem(L, 2, element)) {
cout << "获取第二个元素成功,值: " << element << endl;
}
else {
cout << "获取第二个元素失败" << endl;
}
//7.单链表根据值查询所在的位置
int index = 0;
if (Link_FindElem(L, 10, index)) {
cout << "查找元素10存在,所在位置: " << index << endl;
}
else {
cout << "不存在元素 10" << endl;
}
//8.删除元素
if (LinkDelete(L, 2)) {
cout << "删除第二个元素" << endl;
LinkPrint(L);
}
else {
cout << "删除第二个元素失败" << endl;
}
//9.单链表销毁
LinkDestroy(L);
system("pause");
return 0;
}
链表的初始化,链表的尾插发,链表的首插法,请输入链表要输入的位置和元素.