1.单链表查找结点:
①.按序号查找结点值:
什么都不说了,课本上的代码yyds,本来觉得课本上的代码不够完整,自己写着写着就越发觉得课本上的代码极其精妙。
LNode* Get(LinkList L, int i) {
//按序号查找结点值
int j = 1;//初始为1
LNode* p = L->next;
if (i < 0) {
//无效返回空
return NULL;
}
else if (i == 0) {
return L;
}
while (p && j < i) {
//查找,若i大于表长,返回null
p = p->next;
j++;
}
return p;
}
②.按值查找表结点:
LNode* LocateElem(LinkList L,int e) {
//按值查找表结点
int j = 1;
LNode* p = L->next;
while (p != NULL && p->data != e) {
p = p->next;
j++;
}
return p;
}
2.插入结点操作:
void insert(LNode *s,int i) {
//在序号i处插入结点s
LNode* p = new LNode;
p = Get(L, i-1);
s->next = p->next;
p->next = s;
}
3.删除结点操作:
void Delete(int i) {
//删除第i个结点
LNode* p = new LNode;
p = Get(L, i - 1);
LNode* q = new LNode;
q = p->next;
p->next = q->next;
free(q);
}
4.运行截图:
5.完整代码:
#include<bits/stdc++.h>
using namespace std;
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
LinkList L = new LNode;
LinkList List_TailInsert(LinkList& L) {
//尾插法
L = new LNode;
LNode* s, * r = L;
int x = 1;
while (x != 10) {
//插入数字1~9
s = new LNode;
s->data = x;
r->next = s;
r = s;
x++;
}
r->next = NULL;
return L;
}
void printk(LinkList& L) {
//输出单链表
LinkList q;
q = L->next;
while (q) {
cout << q->data << " ";
q = q->next;
}
cout << endl;
}
LNode* Get(LinkList L, int i) {
//按序号查找结点值
int j = 1;//初始为1
LNode* p = L->next;
if (i < 0) {
//无效返回空
return NULL;
}
else if (i == 0) {
return L;
}
while (p && j < i) {
//查找,若i大于表长,返回null
p = p->next;
j++;
}
return p;
}
LNode* LocateElem(LinkList L,int e) {
//按值查找表结点
int j = 1;
LNode* p = L->next;
while (p != NULL && p->data != e) {
p = p->next;
j++;
}
if (!p) {
cout << "没有找到值为e的结点!" << endl;
}
else cout << "数值为"<<e<<"的结点序号为:" << j << endl;
return p;
}
void insert(LNode *s,int i) {
//在序号i处插入结点s
LNode* p = new LNode;
p = Get(L, i-1);
s->next = p->next;
p->next = s;
cout << "在第"<<i<<"个结点插入s结点后的输出如下:"<<endl;
printk(L);
}
void Delete(int i) {
//删除第i个结点
LNode* p = new LNode;
p = Get(L, i - 1);
LNode* q = new LNode;
q = p->next;
p->next = q->next;
free(q);
cout << "删除第" << i << "个结点后的输出如下:" << endl;
printk(L);
}
int main() {
L = List_TailInsert(L);
cout << "新建单链表输出如下:" << endl;
printk(L);
cout << "第三个结点数据元素为:" << Get(L,3)->data << endl;//查找序号为3结点的元素值
LNode* p = new LNode;
p = LocateElem(L, 3);//按元素值查找结点序号
LNode* s = new LNode;
s->data = 10;
insert(s, 3);//在序号i处插入结点s
Delete(3);//删除第i个结点
return 0;
}