数据结构-单链表操作实践

数据结构-单链表操作实践

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;
}

创作不易,喜欢的话加个关注点个赞,谢谢谢谢谢谢!

全部评论

相关推荐

hso_:哈哈哈哈哈哈我没offer一样在同一道题开喷了
投递深圳同为数码等公司10个岗位
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务