数据结构-单链表操作实践
数据结构-单链表操作实践
1. 编写函数,实现输入一组元素,建立一个带头结点的单链表
#include <iostream>
#include <malloc.h>
using namespace std;
/** * 定义结点类型结构体,有一个data域和一个next域 */
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
/** * 初始化,生成带有头结点的单链表 * @param L 引用类型,头指针 */
void InitLinkList(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));
if (L) {
//内存分配成功
L->next = NULL;
}
}
/** * 尾插法建立单链表 * @param L 链表L * @param n 需要插入的元素的个数 */
void RailInsert_LinkList(LinkList& L, int n) {
LNode* s, * r; //s用于指向新申请的节点空间,r用于始终指向尾结点
r = L; //r初始指向头结点
for (int i = 1; i <= n; ++i) {
s = (LNode*)malloc(sizeof(LNode));
if (s)
{
cin >> s->data;
/** * 尾插法的关键步骤 */
r->next = s; //直接让r的next指向新结点s
r = s; //再让r重新指向当前的尾结点
}
}
r->next = NULL; //最后,将r的next置空
}
/** * 按顺序输出单链表中元素的值 * @param L 单链表的头指针 */
void Print_LinkList(LinkList L) {
LNode* p = L->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
LinkList L;
InitLinkList(L);
int n;
cin >> n;
RailInsert_LinkList(L, n);
Print_LinkList(L);
return 0;
}
2. 对该链表进行非递减排序
/** * 对链表非递减排序 * @param L 链表L */
void Ascend_LinkList(LinkList& L) {
LNode* p = L->next;
LNode* q = p->next;
int tmp;
int flag=1; // 标志
while (flag) {
flag = 0; // 没有发生交换就退出
while (q != NULL) {
if (p->data < q->data) {
// 交换值
tmp = p->data;
p->data = q->data;
q->data = tmp;
flag = 1;
}
p = p->next;
q = q->next;
}
p = L->next;
q = p->next;
}
}
cout << "非递减排序:";
Ascend_LinkList(L);
Print_LinkList(L);
3. 实现在非递减有序链表中删除值为x的结点
/** * 删除值为x的结点 * @param L 链表L * @param x 要删除结点的值 */
void DeleteNode_LinkList(LinkList& L, int x) {
LNode* p = L;
LNode* q = L->next;
while (q != NULL) {
if (q->data == x) {
p->next = q->next;
free(q);
break;
}
p = p->next;
q = q->next;
}
if (!q) {
cout << "不存在值为" << x << "的结点" << endl;
}
}
cout << "删除元素:";
int x;
cin >> x;
DeleteNode_LinkList(L, x);
Print_LinkList(L);
完整程序代码
#include <iostream>
#include <malloc.h>
using namespace std;
/** * 定义结点类型结构体,有一个data域和一个next域 */
typedef struct LNode {
int data;
struct LNode* next;
}LNode, * LinkList;
/** * 初始化,生成带有头结点的单链表 * @param L 引用类型,头指针 */
void InitLinkList(LinkList& L) {
L = (LinkList)malloc(sizeof(LNode));
if (L) {
//内存分配成功
L->next = NULL;
}
}
/** * 尾插法建立单链表 * @param L 链表L * @param n 需要插入的元素的个数 */
void RailInsert_LinkList(LinkList& L, int n) {
LNode* s, * r; //s用于指向新申请的节点空间,r用于始终指向尾结点
r = L; //r初始指向头结点
for (int i = 1; i <= n; ++i) {
s = (LNode*)malloc(sizeof(LNode));
if (s)
{
cin >> s->data;
/** * 尾插法的关键步骤 */
r->next = s; //直接让r的next指向新结点s
r = s; //再让r重新指向当前的尾结点
}
}
r->next = NULL; //最后,将r的next置空
}
/** * 对链表非递减排序 * @param L 链表L */
void Ascend_LinkList(LinkList& L) {
LNode* p = L->next;
LNode* q = p->next;
int tmp;
int flag=1; // 标志
while (flag) {
flag = 0; // 没有发生交换就退出
while (q != NULL) {
if (p->data < q->data) {
// 交换值
tmp = p->data;
p->data = q->data;
q->data = tmp;
flag = 1;
}
p = p->next;
q = q->next;
}
p = L->next;
q = p->next;
}
}
/** * 删除值为x的结点 * @param L 链表L * @param x 要删除结点的值 */
void DeleteNode_LinkList(LinkList& L, int x) {
LNode* p = L;
LNode* q = L->next;
while (q != NULL) {
if (q->data == x) {
p->next = q->next;
free(q);
break;
}
p = p->next;
q = q->next;
}
if (!q) {
cout << "不存在值为" << x << "的结点" << endl;
}
}
/** * 按顺序输出单链表中元素的值 * @param L 单链表的头指针 */
void Print_LinkList(LinkList L) {
LNode* p = L->next;
while (p != NULL) {
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
int main() {
LinkList L;
InitLinkList(L);
int n;
cin >> n;
RailInsert_LinkList(L, n);
Print_LinkList(L);
cout << "非递减排序:";
Ascend_LinkList(L);
Print_LinkList(L);
cout << "删除元素:";
int x;
cin >> x;
DeleteNode_LinkList(L, x);
Print_LinkList(L);
return 0;
}
创作不易,喜欢的话加个关注点个赞,谢谢谢谢谢谢!