代码可能有点长,想学习的小伙伴可以细读哟,不懂也可以问博主哟
愿所有想学习的帅哥美女都能学懂(一开始接触我也很懵逼)
我当初就是靠这个视频理解的yo,真的值得学习。
1.实验目的(结出本次实验所涉及并要求掌握的知识点)
1.熟悉掌握动态链表结构及有关算法的设计方法.
2.理解不带头结点的单链表的特点,掌握其基本操作.
3.熟练掌握运用不带头结点链表表示特定形式的数据的方法,并设计出有关算法.
2.实验内容(结出实验内容具体描述)
1.编写函数linklist delx(linklist head,datatype x);删除不带头结点单链表head中第一个值为x的节点,并构造样例调试.
2.用不带头结点的单链表储存线性表,请设计算法函数linklist reverse1(node* head)和void reverse2(node** head)将其倒置,并构造样例调试
3.假设不带头结点的单链表head是升序排列,设计算法函数linklist insert(linklist head,datatype x);将值为x的结点插入到链表head中,保持其有序性,分别构造插入到表头、表中和表尾3种情况进行调试。
4.编写算法函数linklist delallx(node* head,datatype x);删除不带头结点单链表中所有值为x的结点。
3.算法描述及实验步骤(用适当的形式表达算法设计思想与算法实现步骤)
#include <iostream>
#include <cstdio>
#include <cstdlib>
using namespace std;
typedef int datatype;
typedef struct node_
{
datatype data;
struct node_ *next;
} node;
typedef node *linklist;
linklist createbystack()
{ //无头结点的头插法;
node *head, *s;
datatype x;
head = NULL;
cout << "请输入若干数据,以0为结束符" << endl;
cin >> x;
while (x)
{
s = (node *)malloc(sizeof(node));
s->data = x;
s->next = head;
head = s;
cin >> x;
}
return head;
}
linklist createbyqueue() //无头结点的尾插法
{
node *head = NULL;
node *p;
node *s;
datatype x;
cout << "请输入若干数据,以0为结束符" << endl;
cin >> x;
while (x)
{
p = (node *)malloc(sizeof(node));
p->data = x;
if (!head)
{
head = p;
s = head;
}
else
{
s->next = p;
s = p;
}
cin >> x;
}
s->next = NULL;
return head;
}
void output(node *head)
{
node *p = head;
int i = 0;
if (!p)
{
cout << "空的" << endl;
}
while (p)
{
cout << p->data << ' ';
p = p->next;
i++;
if (i % 10 == 0)
cout << endl;
}
cout << endl;
}
void dellist(node *head)
{
node *p = head;
while (p)
{
p = p->next;
free(head);
head = p;
}
}
linklist delx(node *head, datatype x) //先找到x的位置,再利用p及其前节点s修改s节点的指向,再释放删除节点的内存,
//对于第一个节点特殊处理
{
node *p = head;
node *s;
while (p && p->data != x)
{
s = p;
p = p->next;
}
if (p == NULL)
{
cout << "链表中无值为x的数" << endl;
return head;
}
else if (head->data == x)
{
head = head->next;
free(p);
return head;
}
else
{
s->next = p->next;
free(p);
return head;
}
}
linklist reverse1(node *head) //利用头插法原理进行倒置,修改指针指向.
{
node *p = head;
node *s;
head = NULL;
while (p)
{
s = p->next;
p->next = head;
head = p;
p = s;
}
return head;
}
void reverse2(node **head) //也是头插法,由head此时为结构体指针的指针,(*head)即为原结构体的指针,
//通过修改(*head)来改变原链表的指向,由于是通过指针的地址修改这个实际指针指向,故无需返回.
{
node *p = (*head);
node *s;
(*head) = NULL;
while (p)
{
s = p->next;
p->next = (*head);
(*head) = p;
p = s;
}
}
linklist insert(node *head, datatype x) //比较大小找到要插入的位置,由前后两节点连接.对于第一个节点特殊处理.
{
node *p = head;
node *s = head;
node *temp = (node *)malloc(sizeof(node));
temp->data = x;
if (head->data >= x)
{
temp->next = head;
head = temp;
return head;
}
p = p->next;
while (p && p->data < x)
{
s = s->next;
p = p->next;
}
s->next = temp;
temp->next = p;
return head;
}
linklist delallx(node *head, datatype x) //一个个找x的值,找到清除,直至遍历完整个链表,第一个特殊处理.
{
node *p = head;
node *s;
node *r;
while (p)
{
if (head->data == x)
{
head = head->next;
s = p;
p = p->next;
}
else if (p->data == x)
{
r = p;
s->next = p->next;
p = p->next;
free(r);
}
else
{
s = p;
p = p->next;
}
}
return head;
}
int main()
{
// datatype x;
// node *head;
// head = createbyqueue();
// output(head);
// cout << "请输入要删除的值:";//第一个实验
// cin >> x;
// head = delx(head, x);
// output(head);
// dellist(head);
// system("pause");
// datatype x;
// node *head;
// head = createbystack();
// output(head);
// head = reverse1(head);
// output(head);
// reverse2(&head);//第二个实验
// output(head);
// dellist(head);
// system("pause");
// datatype x;
// node *head;
// cout << "请输入一组升序排列的数" << endl;
// head = createbyqueue();
// output(head);
// cout << "请输入要插入的值:";//第三个实验
// cin >> x;
// head = insert(head, x);
// output(head);
// dellist(head);
// system("pause");
// datatype x;
// node *head;
// head = createbyqueue();
// output(head);
// cout << "请输入要删除的数:";//第四个实验
// cin >> x;
// head = delallx(head, x);
// output(head);
// dellist(head);
// system("pause");
return 0;
}
4.调试过程及运行结果(详细记录在调试过程中出现的问题及解决方法。记录实验执行的结果)
实验1:
一.请输入若干数据,以0为结束符
1 2 3 4 5 6 0
1 2 3 4 5 6
请输入要删除的值:6
1 2 3 4 5
二.请输入若干数据,以0为结束符
1 2 3 4 5 6 0
1 2 3 4 5 6
请输入要删除的值:1
2 3 4 5 6
实验2:
一.
请输入若干数据,以0为结束符
1 2 3 4 5 6 0
6 5 4 3 2 1
1 2 3 4 5 6
6 5 4 3 2 1
二.
请输入若干数据,以0为结束符
0
空的
空的
空的
实验3:
一.
请输入一组升序排列的数
请输入若干数据,以0为结束符
1 2 3 4 5 6 0
1 2 3 4 5 6
请输入要插入的值:0
0 1 2 3 4 5 6
二.
请输入一组升序排列的数
请输入若干数据,以0为结束符
1 2 3 4 5 6 0
1 2 3 4 5 6
请输入要插入的值:9
1 2 3 4 5 6 9
三.
请输入一组升序排列的数
请输入若干数据,以0为结束符
1 2 3 5 6 0
1 2 3 5 6
请输入要插入的值:4
1 2 3 4 5 6
实验四:
一.
请输入若干数据,以0为结束符
2 3 6 5 2 2 2 2 0
2 3 6 5 2 2 2 2
请输入要删除的数:2
3 6 5
二.
请输入若干数据,以0为结束符
2 5 6 8 3 3 5 6 3 0
2 5 6 8 3 3 5 6 3
请输入要删除的数:3
2 5 6 8 5 6