IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> C++:实现链表的显示、排序等 -> 正文阅读

[数据结构与算法]C++:实现链表的显示、排序等

// list_example.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <iostream>
using namespace std;
#define N 5

typedef struct node				//定义一个节点
{
	int data;
	struct node *next;
}Node;

Node* createList(int a[]);		//用数组a建立链表,返回头结点地址
void outlist(Node *h);			//输出链表的节点值
void destroylist(Node *h);		//销毁链表
int sumlist(Node *h);			//求和
int maxlist(Node *h);			//求最大值
int	countlist(Node *h);			//统计链表中的节点值
void sortlist(Node *h);			//从小到大排序
void insertNode(Node *h, int a, int d);	//插入一个节点
void deleteNode(Node *h, int a);	//删除一个节点


int _tmain(int argc, _TCHAR* argv[])
{
	int a[5] = { 1, 2, 6, 5, 4 };
	Node *head;				//头地址
	head = createList(a);	//建立链表
	outlist(head);			//显示链表
	cout << "链表中元素的和为:" << sumlist(head) << endl;
	cout << "链表中最大的元素为:" << maxlist(head) << endl;
	cout << "链表中数的和为:" << countlist(head) << endl;
	insertNode(head, 6, 20);		//在6后插入
	cout << "插入20后的链表元素为:" << endl;
	outlist(head);			//显示链表
	cout << endl;

	deleteNode(head, 2);
	cout << "删除2后的链表元素为:" << endl;
	outlist(head);			//显示链表
	cout << endl;


	sortlist(head);			//由小到大排序
	cout << "排序后链表中元素为:" << endl;
	outlist(head);			//显示链表
	cout<< endl;			

	destroylist(head);		//销毁链表
	getchar();
	return 0;
}

Node* createList(int a[])		//用数组a建立链表,返回头结点地址
{
	Node *h=NULL;		//指向头结点,即保存头结点的地址
	Node *p, *q;	//*p指向当前节点,*q指向上一节点
	q = new Node;	//开辟空间
	h = q;			//确定了头地址,现在h、q两个指针均指向头结点

	//建立链表中的结点,现在的上一节点为头结点,q指向
	for (int i = 0; i < N; i++)			//暂定5个节点
	{
		p = new Node;	//开辟空间
		p->data = a[i]; //节点的值	
		p->next = NULL;
		q->next = p;	//上一节点,指向本当前节点
		q = p;			//等下次循环,p变为上一节点
	}
	q->next = NULL;		//最后一个节点的指针域为空
	return h;			//返回链表的头结点地址
}
void outlist(Node *h)			//输出链表的节点值
{
	Node *p = NULL;
	p = h->next;			//p指向第一个节点
	int i = 1;
	while (p != NULL)
	{
		cout << " 第" << i << "个节点的值为" << p->data << endl;
		i++;
		p = p->next;	//指向下一个节点
	}
}
void destroylist(Node *h)		//销毁链表
{
	Node *p, *q;			//定义两个结构体指针
	p = h->next;			
	while (p != NULL)
	{
		q = p->next;		//先备份
		free(p);
		p = q;				//p指向下一个节点
	}
	free(h);				//销毁头结点
	cout << "已销毁链表!" << endl;
}

int sumlist(Node *h)			//求和
{
	Node  *p = h->next;				//存储地址
	int sum = 0;
	while (p != NULL)			//遍历
	{
		sum = sum + p->data;
		p = p->next;			
	}
	return sum;				//返回和

}

int maxlist(Node *h)			//求最大值
{
	Node  *p = h->next;			//存储地址
	int a = 0;					//用于比较
	while (p != NULL)			//遍历
	{
		if (a < p->data )			//如果新节点中的值更大,那把它替换为a
									//保证a是已比较数中最大的
		a =  p->data;
		p = p->next;
	}
	return a;				//返回和
}

int	countlist(Node *h)			//统计链表中的节点值
{

	Node  *p = h->next;			
	int num = 0;				
	while (p != NULL)			//遍历
	{
		num++;
		p = p->next;
	}
	return num;				   //返回节点数量

}

//外层用指针变量p,内层用指针变量q
void	sortlist(Node *h)			//从小到大排序
{
	Node *p, *q;
	int temp =0;
	p = h -> next;				//指向第一个节点
	while (p != NULL)			//外层循环
	{
		q = p->next;			//q指向第2个节点
		while (q != NULL)		//内层循环
		{
			if ((p->data) > (q->data))	//后面的数大于前面的数,则交换
			{
				temp = p->data;
				p->data = q->data;
				q->data = temp;
				
			}
			q = q->next;
			
		}
		p = p->next;
	}
}

//插入节点,节点为a,值为d
void insertNode(Node *h, int a, int d)	//插入一个节点
{
	Node *p, *q;		// p指向插入位置,q指向前一位置
	Node *s;			//新节点
	s = new Node;		//申请新节点空间
	s->data = d;

	//定位插入位置
	q = h;
	p = h->next;		//节点q在前,p在后
	while (p !=NULL)
	{
		if (p->data == a)
			break;
		q = p;		//当p->data == 6时,q在p前
		p = p->next;//节点q在前,p在后
	}

	//插入新节点,先连再断
	s->next = q->next;
	q->next = s;		
}

void deleteNode(Node *h, int a)			//删除节点
{
	Node *p, *q;		//p指向要删除节点,q指向前一节点
	//定位要删除的节点
	q = h;
	p = h->next;		//节点q在前,p在后
	while (p != NULL)
	{
		if (p->data == a)
			break;
		q = p;		//当p->data == 6时,q在p前
		p = p->next;//节点q在前,p在后
	}
	//删除节点,只有找到才删除
	if (p != NULL)
	{
		q->next = p->next;		//
		free(p);
	}
}

运行结果:

?

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-05-09 12:59:06  更:2022-05-09 13:01:28 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:33:06-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码