单链表的链式存储之独立结点构成

例:编写一个程序依次实现如下功能:
(1)让计算机产生出20个0一9之间的随机整数并依次保存到单链表中;
(2)输出遍历单链表;
(3)从单链表中删除与给定值相等的所有结点;
(4)输出遍历单链表;

(5)输出单链表的长度。


由独立结点构成的单链表

.h文件:

/*由独立结点构成的单链表*/

//初始化
void InitList(LNode* &HL)
{
	HL = NULL;
}

//清空单链表
void ClearList(LNode* &HL)
{
	LNode *cp,*np;   //cp:current pointer;  np: next pointer
	cp = HL;
	while(cp != NULL)  //遍历
	{
		np = cp->next;
		delete np;
		cp = np;
	}
	HL = NULL;
}

//得到单链表的长度
int ListSize(LNode* &HL)
{
	LNode *p = HL;
	int i = 0;
	while(p != NULL)
	{
		i++;
		p = p->next;
	}
	return i;
}

//检查单链表是否为空
int ListEmpty(LNode* &HL)
{
	return (HL == NULL);
}

//得到单链表中指定位置的元素
ElemType GetElem(LNode* &HL, int pos)
{
	if(pos < 1)
	{
		cerr<<"pos is out of range!"<<endl;
		exit(1);
	}
	LNode *p = HL;
	int i = 0;   //统计已遍历的结点数
	while(p != NULL)
	{
		i++;
		if(i == pos)
			break;
		p = p->next;
	}
	if(p != NULL)
		return p->data;
	else
	{
		cerr<<"pos is out of range!"<<endl;
		exit(1);
	}
}

//遍历单链表并打印
void TraverseList(LNode* &HL)
{
	LNode *p = HL;
	while(p != NULL)
	{
		cout<<p->data<<" ";
		p = p->next;
	}
	cout<<endl;
}

//从单链表中查找具有给定值的第一个元素
int Find(LNode* HL, ElemType &item)
{
	LNode *p = HL;
	while(p != NULL)
	{
		if(p->data == item)
		{
			item = p->data;
			return 1;
		}
		else
			p = p->next;
	}
	return 0;
}

//更新单链表中具有给定值的第一个元素
int Update(LNode* &HL, const ElemType &item)
{
	LNode *p = HL;
	while(p != NULL)
	{
		if(p->data == item)
			break;
		else
			p = p->next;
	}
	if(p == NULL)
		return 0;
	else
	{
		p->data = item;
		return 1;
	}
}

//向单链表的末尾添加一个元素
void InsertRear(LNode* &HL, const ElemType &item)
{
	LNode *newptr;
	newptr = new LNode;  //为保存新元素分配动态结点
	if(newptr == NULL)
	{
		cerr<<"Memory allocation failare!"<<endl;
		exit(1);
	}
	newptr->data = item;
	newptr->next = NULL;
	if(HL == NULL)
		HL = newptr;
	else
	{
		LNode *p = HL;
		while(p->next != NULL)  //从表头开始遍历到最后一个结点为止
			p = p->next;
		p->next = newptr;   //把新结点链接到表尾
	}
}

//向单链表的表头插入一个元素
void InsertFront(LNode* &HL, const ElemType &item)
{
	LNode *newptr;
	newptr = new LNode;
	if(newptr == NULL)
	{
		cerr<<"Memory allocation failare!"<<endl;
		exit(1);
	}
	newptr->data = item;
	newptr->next = HL;
	HL = newptr;
}

//向单链表中满足条件的位置插入一个元素
void Insert(LNode* &HL, const ElemType &item)
{
	LNode *newptr;
	newptr = new LNode;
	if(newptr == NULL)
	{
		cerr<<"Memory allocation failare!"<<endl;
		exit(1);
	}
	newptr->data = item;
	LNode *cp,*ap; //ap:ahead pointer前驱结点
	cp = HL;
	ap = NULL;
	while(cp != NULL)
	{
		if(item < cp->data)
			break;
		else
		{
			ap = cp;
			cp = cp->next;
		}
	}
	if(ap == NULL)
	{
		newptr->next = HL;
		HL = newptr;
	}
	else
	{
		newptr->next = cp;
		ap->next = newptr;
	}
}

//从单链表中删除表头元素
ElemType DeleteFront(LNode* &HL)
{
	if(HL == NULL)
	{
		cerr<<"Deleting from an empty list!"<<endl;
		exit(1);
	}
	LNode *p = HL;
	HL = HL->next;
	ElemType temp = p->data;
	delete p;
	return temp;
}

//从单链表中删除等于给定值的第一个元素
int Delete(LNode* &HL, const ElemType &item)
{
	if(HL == NULL)
	{
		cerr<<"HL is NULL"<<endl;
		exit(1);
	}
	LNode *ap,*cp;
	ap = NULL;
	cp = HL;
	while(cp != NULL)
	{
		if(item == cp->data)
			break;
		else
		{
			ap = cp;
			cp = cp->next;
		}
	}
	if(cp == NULL)
	{
		cerr<<"Deleted element is not exist!"<<endl;
		return 0;
	}
	if(ap == NULL)
		HL = HL->next;
	else
		ap->next = cp->next;
	delete cp;
	return 1;
}

//单链表排序
/*
假定待排序的n个数据存在于一维数组a[n]中,当利用单链表进行排序时,
从空的单链表开始,每次调用Insert算法向单链表中插入数组中的一个元素
*/
void LinkSort(ElemType a[], int n)
{
	LNode *head = NULL;
	int i;
	for(i = 0; i < n; i++)
	{
		Insert(head,a[i]);
	}
	LNode *p = head;
	i = 0;
	while(p != NULL)
	{
		a[i++] = p->data;
		p = p->next;
	}
	ClearList(head);
}

.cpp文件:

#include <iostream>
#include <stdlib.h>

using namespace std;

typedef int ElemType;

struct LNode
{
	ElemType data;
	LNode *next;
};

#include "LinearList.h"

int main()
{
	LNode *head;
	InitList(head);
	for(int i = 0; i < 20; i++)
	{
		int j = rand() % 10;
		InsertRear(head,j);
	}
	//输出遍历单链表
	TraverseList(head);
	//从单链表中删除与键盘输入的值相等的所有结点
	cout<<"输入一个0~9之间的整数:";
	int temp,flag = 0;
	while(flag == 0)
	{
		cin>>temp;
		while(Delete(head,temp))
		{
			flag = 1;
		}
		if(flag == 1)
			cout<<"已删除完毕!"<<endl;
		else
			cout<<"输入数据不正确,请重新输入一个0~9之间的整数:";
	}

	//输出遍历单链表
	TraverseList(head);

	//输出单链表长度
	cout<<ListSize(head)<<endl;
	return 0;
}









  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值