系列文章目录
前言
文章建议复制到编译器查看学习,因为注释和讲解都在代码上。
运行环境:Dev_C++,vs2019
提示:以下是本篇文章正文内容,下面案例可供参考
一、代码示例。
示例:
#include<iostream>
using namespace std;
/*
单链表的基本操作
该例的链表排序以0开始
以输入 9 4 8 6 22 11 为例
*/
struct List {
int data;//链表的数据
List* next;//链表的next指针
};
int main() {
//创建一个头指针
void create(List * );//创建一个指针链表,传入头指针
void through(List * );//遍历整个链表
void insert(List *,int n,int new_date);//插入在第几个节点后面插入,插入数据为new_date的数据
void List_delete(List *,int n);//删除第n个位置的节点
void find(List * p, int n);//查找第n个节点
void change(List * p, int n, int new_date);//修改第n个节点
List head;
head.data = 0;
head.next = NULL;
List* p = &head;
create(p);
through(p);
insert(p, 4, 7);//为第四个位置后新加一个节点,该节点的数据成员为7
cout << endl;
through(p);
cout << endl;
List_delete(p, 5);//删除第4个节点
through(p);
find(p, 5);//查找位置5的数据
change(p, 2,99);//修改位置2的节点值为99
through(p);//遍历链表查看结果
return 0;
}
void create(List* phead) {//传入头结点
//假设创建一个6长的链表
List* p = phead;
for (int i=0;i<6;i++) {
List* new_p = new List; //创建一个新节点
cin >> new_p->data; //设置节点内的数据
new_p->next = NULL;
p->next = new_p;//让指向头结点的指针,指向下一个节点
p = new_p;
}
}
void through(List *phead) {
List* p = phead;
int i=0;
while (1) {
p = p->next;//从第一个节点输出
cout << "第" << i << "个节点:";
cout << p->data << " ";
if (i % 5 == 4) cout << endl;//输出5个换行
++i;
if (p->next == NULL) break;
}
cout << endl;
}
void insert(List* phead,int n,int new_date ) {
List* p = phead;
for (int i = 0; i <=n; i++) {
p = p->next;
}
List* new_p = new List;//创建一个新结点,赋值给新结点
new_p->data = new_date;
new_p->next = p->next;//新结点指向n+1节点
p->next = new_p;//将新节点连起来
}
void List_delete(List* phead,int n) {
List* p = phead;
for (int i=0;i<n-1;i++) {
p = p->next; //定位到要删除结点的前一个节点
}
p->next = p->next->next;//将上个节点的next指向删除节点的后一个,绕过它
}
void find(List* phead, int n){
List* p = phead;
for (int i=0;i<=n;i++) {
p = p->next; //使p到这个位置
}
cout << "第" << n << "个节点是:" << p->data << endl;
}
void change(List *phead,int n,int new_data) {
List* p = phead;
for (int i=0;i<=n;i++) {
p = p->next;
}
p->data = new_data;//修改这个节点值
}
二、结果展示
1.定义的函数和全局变量
2.链表的创建
creat(List *p)函数
3.链表的遍历
through(List *)函数
4.插入
void insert(List *,int n,int new_date);//插入在第几个节点后面插入,插入数据为new_date的数据
5.删除
void List_delete(List *,int n);//删除第n个位置的节点
6.查找
void find(List * p, int n);//查找第n个节点
7.修改
void change(List * p, int n, int new_date);//修改第n个节点
三、双向链表
双向链表的基本操作与单链表差不多,所以这里仅给出添加,删除,创建,展示,求长度这五个函数
总的:
源代码
#include<iostream>
typedef int Datatype;
using namespace std;
typedef struct List {
Datatype data;
List* prior;//前节点
List* next;
};
int main() {
void create(List * phead, Datatype n);//创建
int InsertDList(List * L, int index, Datatype x);//插入
void show(List * L);//打印数据
int deletDList(List * L, int index, Datatype * e);//删除
int T=0;//存下被删除的值
List head;//创建头结点
head.data = 0;
head.next = NULL;
head.prior = NULL;
create(&head,5);
InsertDList(&head, 3, 100);
show(&head);
cout << "以下为删除" << endl;
deletDList(&head, 4, &T);
show(&head);
return 0;
}
int InsertDList(List *L,int index,Datatype x) {//在第index个位置插入值为X的节点 index:下标
int i = 0;
List* p = L,* temp;
while (1) {
if (p->next == NULL) break;
i++;
p = p->next;
}
if (index<=0 || index>i) {
cout << "插入位置错误";
return -1;
}
temp= L;//让指针再指回L
for (int j=0;j<index-1;j++) {//循环到插入位置前一个节点
temp = temp->next;
}
List* new_node = new List;//创建一个新结点
new_node->data = x;//将新结点指向下一个
new_node->next = temp->next;
new_node->prior = temp;
temp->next = new_node;//移位
}
void create(List* phead, Datatype n) {//传入头节点和,创建链表的多少
List* p = phead;
for (int i = 0; i < n; i++) {
List *new_node = new List;
cin >> new_node->data;//初始化新结点
new_node->next = NULL;
new_node->prior = p;
p->next = new_node;//指向新结点
p = p-> next;//移位
}
}
void show(List *L) {
int i = 0;
List* p = L;
while (1) {
cout << "第" << i << "位:" << p->data<< endl;
p = p->next;
i++;
if (p== NULL) break;
}
}
int deletDList(List *L,int index,Datatype *e) {//删除下标为index的值,将被删除值保存到e
int lenthDList(List * L);
List* p = L,*p1=L;
if (index <= 1 || index > (lenthDList(p))) {
cout << "删除位置错误" << endl;
return -1;
}
for (int i=0;i<index-1;i++) {//定位节点指向index
p = p->next;
}
cout << "p:" << p->data;
if (p->next==NULL) {//是为节点
p->prior->next = NULL;//将前一个节点指向空
*e = p->data;//保存值
delete p;
return 1;
}
else {
p->next->prior = p->prior;//将链表指向更改
p->prior->next = p->next;
*e = p->data;
delete p;
return 1;
}
}
int lenthDList(List *L) {
List* p = L;
int i = 0;
while (1) {
if (p->next == NULL) break;
i++;
p = p->next;
}
return i;
}
运行结果演示:
这里是创建一个5长的双向链表
在第3位添加100
在第4位删除100
的操作截图