链表《2》使用函数操作链表

使用函数操作链表

1:计算链表中结点的个数:定义一个Length_list()函数用于计算链表中结点的个数

函数代码:

//计算链表中结点的个数
void Length_list(PNODE pHead)
{
	PNODE p = pHead->pNext;

	int len = 0;

	while(NULL != p)
	{
		len++;

		p = p->pNext;
	}

	printf("这条链表中有%d个结点\n",len);
}

2判断链表是否为空:定义一个Is_empty()函数用于判断链表是否为空

函数代码:

//判断链表是否为空
void Is_empty(PNODE pHead)
{
	if(NULL == pHead->pNext)
	{
		printf("链表为空!\n");
	}
	else
	{
		printf("链表不为空!\n");
	}
}

3:对链表中的数据排序:定义一个Scort_list()函数用于对链表中的数据排序

//对链表中的数据排序
void Sort_list(PNODE pHead)
{
	int temp;//中间变量

	PNODE p, q;

	for(p = pHead; NULL != p; p=p->pNext)
	{
		for(q=p->pNext; NULL != q; q=q->pNext)
		{
			if(p->data > q->data)
			{
				temp = p->data;
				p->data  = q->data;
				q->data = temp;
			}
		}
	}
}

程序的所有代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node//结点结构
{
	int data;//数据域

	struct Node *pNext;//指针域
}NODE, *PNODE;

//创建链表
PNODE Create_list(void);

//遍历链表
void Traverse_list(PNODE pHead);

//判断链表是否为空
void Is_empty(PNODE pHead);

//计算链表中结合的个数
void Length_list(PNODE pHead);

//对链表中的数据排序
void Sort_list(PNODE pHead);

void main()
{
	PNODE pHead = NULL;

	pHead = Create_list();//创建一个非循环单链表

	Traverse_list(pHead);//遍历链表

	Is_empty(pHead);//判断链表是否为空

	Length_list(pHead);//计算链表的长度

	Sort_list(pHead);//对链表中的结点排序

	Traverse_list(pHead);//遍历输出链表中的数据

	system("pause");
}

//创建链表
PNODE Create_list(void)
{
	int len;//结点的个数

	int val;//临时保存结点的值

	//分配一个不存放有效数据的头结点
	PNODE pHead = (PNODE)malloc(sizeof(NODE));

	if(NULL == pHead)
	{
		printf("内存分配失败,程序终止!");

		exit(-1);
	}

	//定义一个永远指向尾结点的结点
	PNODE pTail = pHead;
	pTail->pNext = NULL;

	printf("请输入您需要生成的链表的结点的个数:");
	scanf("%d",&len);

	for(int i=0; i<len; i++)
	{
		printf("请输入第%d个结点的值:", i+1);
		scanf("%d",&val);

		//创建一个临时结点
		PNODE pNew = (PNODE)malloc(sizeof(NODE));

		if(NULL == pNew)
		{
			printf("内存分配失败,程序终止!");

			exit(-1);
		}

		pNew->data = val;
		pTail->pNext = pNew;
		pNew->pNext = NULL;
		pTail = pNew;
	}

	return pHead;
}

//遍历链表
void Traverse_list(PNODE pHead)
{
	PNODE p = pHead->pNext;

	while(NULL != p)
	{
		printf("%d ", p->data);

		p = p->pNext;
	}

	printf("\n");

	return;
}

//判断链表是否为空
void Is_empty(PNODE pHead)
{
	if(NULL == pHead->pNext)
	{
		printf("链表为空!\n");
	}
	else
	{
		printf("链表不为空!\n");
	}
}

//计算链表中结点的个数
void Length_list(PNODE pHead)
{
	PNODE p = pHead->pNext;

	int len = 0;

	while(NULL != p)
	{
		len++;

		p = p->pNext;
	}

	printf("这条链表中有%d个结点\n",len);
}

//对链表中的数据排序
void Sort_list(PNODE pHead)
{
	int temp;//中间变量

	PNODE p, q;

	for(p = pHead; NULL != p; p=p->pNext)
	{
		for(q=p->pNext; NULL != q; q=q->pNext)
		{
			if(p->data > q->data)
			{
				temp = p->data;
				p->data  = q->data;
				q->data = temp;
			}
		}
	}
}

测试程序:

当链表中没有结点时

当链表中有1个结点时

当链表中有5个结点时

链表《2》使用函数操作链表,码迷,mamicode.com

时间: 2024-10-29 19:09:45

链表《2》使用函数操作链表的相关文章

链表及其各种函数操作的实现方法

代码中主要实现了下面四个操作: 下面几种操作都是线性操作,算法复杂度都是O(n): 链表插入默认是按关键字大小插入链表的,所以最后得到的结果是从大到小排好序的,分三种情况(1)链表为空(2)插入的点最小,插在链表最前面:(3)插入链表中间;(4)插入链表结尾. 链表删除是在链表中找到要删除的关键字,然后删除该节点,如果有两个以上,只删一个.如果没有就返回.删除操作必须释放删除结点所申请的内存: 查找最大理论上就是最后一个,查找最小理论上就是第一个结点.但是我为了通用性写成了遍历整个链表查找最大和

List (单链表17个函数讲解)

链表时一种常用的数据结构,是通过"链"来建立起数据元素之间的逻辑关系,这种用链接方式储存的线性表简称链表(Link List). 一,链表与顺序表的对比 在接触链表之前大家想必已经了解过了顺序表的储存结构方式,顺序表与链表的不同之处如下: 1.顺序表是物理位置上相邻来表示数据元素之间的逻辑关系:但链表不是,物理地址不相连,通过指针来链接. 2.顺序表储存密度高,且能够随机的存取数据(通过下标):但链表不能随机访问,只能通过头指针遍历到指定节点遍历,这点没有顺序表方便. 3.顺序表插入删

关于链表的一些重要操作(Important operations on a Linked List)

上篇博文中讨论了链表的一些基本操作: 链表的基本操作(Basic Operations on a Linked List) 然而,为创建一个多功能的链表,在深度学习之前我们还需要了解更多的链表操作. 在表头插入元素. 在表中插入元素. 在确定的位置插入. 在某个元素的后面插入. 从链表中删除一个元素. 删除整个链表. 在链表头部插入元素 为了在链表头部插入元素,我们要完成一项小任务:创建一个临时节点,把数据存入这个临时节点,将这个节点指向链表的头节点. /* Defining a functio

链表的特有算法操作

10.42 使用list的算法实现排序和删除重复元素. #include<algorithm> #include<list> #include<iostream> #include<string> using namespace std; void elimDup(list<string> &words) { words.sort(); words.unique(); } bool isShorter(const string &

关于链表的一些简单操作

终于上黄金了.. 然后就是一波2连败... 最近 完全不想做题啊  一做题 就想碎觉啊 郁闷死了 根据书本 写了点关于单向链表的简单操作 可能还存在点小bug---先放它一马吧 以后可能再进行补充关于它的操作 毕竟还有好多 先慢慢找回敲键盘打代码的感觉 厌 1 /* 2 线性表之单向链表的一些常见操作 3 */ 4 #include <iostream> 5 using namespace std; 6 7 typedef int ElemType; 8 typedef struct LNod

静态链表的实现与操作(C语言实现)

我们知道要实现单链表,必须要有指针,那么像Java这样没有指针的的语言就略显蛋疼了. 没关系,我们有静态链表,其本质就是用采用数组的方式实现单链表的功能. 头文件: #ifndef _StaticLinkList_H_ #define _StaticLinkList_H_ typedef void StaticLinkList; typedef void StaticLinkListNode; StaticLinkList * StaticLinkList_Create(int capacity

链表的声明及操作

#include<stdio.h> #include<stdlib.h> typedef struct Node *PtrToNode typedef PtrToNode List typedef PtrToNode Position struct Node{ ElementType Element; Position Next; }; /*测试链表是否为空*/ int IsEmpty(List L) { return L->Next == Null; } /*测试是否是链表

链表的无锁操作 (JAVA)

看了下网上关于链表的无锁操作,写的不清楚,遂自己整理一部分,主要使用concurrent并发包的CAS操作. 1. 链表尾部插入 待插入的节点为:cur 尾节点:pred 基本插入方法: do{ pred = find_tail(); //重新找尾节点 }(! pred.next.compareAndSet(NULL, cur)) //pred.next 是否为NULL,是则将其指向cur,不是则有新的节点插入 这种插入方法是不带标记的,如果不涉及链表删除这个方法是可行的. 但是如果有删除操作,

单链表的插入删除操作(c++实现)

下列代码实现的是单链表的按序插入.链表元素的删除.链表的输出 // mylink.h 代码 #ifndef MYLINK_H #define MYLINK_H #include<iostream> using namespace std; struct node { int data; node *next; }; class list { public: list() { head=NULL; }; void insert(int item); void del(int item); voi