软件技术基础与开发 PPT - Class10 - 第2章 - 上机 - 线性表链式存储结构的实现

在这里插入图片描述

参考答案——线性链表的实现

linked_List.h头文件

// linked_List.h
#ifndef linked_List_h
#define linked_List_H

#include <iostream>
using namespace std;

// 定义节点类型
template<class T>
struct node
{
	T d;	// 元素值
	node *next;	// 指针,指向链表中下一节点
};

// 定义线性链表类
template<class T>
class linked_List
{
private:
	node<T> * head;	// 链表头指针
public:
	linked_List();	// 构造函数,建立空链表
	~linked_List();	// 析构函数
	void prt_linked_List();	// 扫描输出链表内元素
	void ins_linked_List(T, T);	// 在包含元素x的结点前插入新元素b
	int del_linked_List(T);	// 删除包含元素x的结点
};

// 构造函数:建立空链表
template<class T>
linked_List<T>::linked_List()
{
	head = NULL;
	return;
}

// 析构函数:释放存储空间
template<class T>
linked_List<T>::~linked_List()
{	
	if (head==NULL) return;		// For empty linked list, nothing need to be done!
	while (head->next!=NULL)	// Loop untile the end of the liked list.
	{
		node<T> * p;
		p = head->next;		// store the next address
		delete head;		// delete the memory of current structure
		head = p;			// head pointer points to the next structure
	}
	return;
}

// 扫描输出链表内元素
template<class T>
void linked_List<T>::prt_linked_List()
{
	node<T> * p;
	p = head;
	if (p==NULL) 
	{
		cout << "空链表! " << endl;
		return;
	}
	do
	{
		cout << p->d << endl;	// 输出当前结点元素值
		p = p->next;	// 指针移至下一结点位置
	}while(p!=NULL);
	return;
}

// 在包含x的结点前插入新元素b
template<class T>
void linked_List<T>::ins_linked_List(T x, T b)
{
	node<T> *p, *q;
	p = new node<T>;	// 申请新结点
	p->d = b;		// 新结点的元素置入b
	if (head==NULL)	// 链表为空时的插入操作
	{
		head = p;
		p->next=NULL;
		return;
	}
	if (head->d==x)	// 若第一个结点的元素为x的话,插入第一个节点前
	{
		p->next = head;
		head = p;
		return;
	}
	q = head;
	// 顺着链表往下找直至找到x位置或者到达链表终端为止,找出的应该是包含x元素的前一个结点q
	while ((q->next!=NULL) && (((q->next)->d)!=x)) 
		q = q->next;
	p->next = q->next;	// 新结点p的下一个结点对应着q结点的下一个结点
	q->next = p;		// q结点的下一个结点则是新结点p
}

// 删除包含x的结点元素
template<class T>
int linked_List<T>::del_linked_List(T x)
{
	node<T> *p, *q;
	if (head==NULL) return(0);	// 空链表
	if ((head->d)==x)	// 链表第一个元素便是x,删除
	{
		p=head->next;
		delete head;	// 释放空间
		head=p;			// 头指到下一结点去
		return (1);
	}
	q = head;
	// 顺着链表找寻x元素,直至找到包含元素x的前一个结点或者到达链表末端
	while ((q->next!=NULL) && (((q->next)->d)!=x))
		q = q->next;
	if (q->next==NULL) return(0);	// 到达链表末端
	p = q->next;	// 指向要删除的元素x所在结点
	q->next = p->next;	// 其前一个结点跨过该节点
	delete p;	// 释放存储空间
	return(1);
}

#endif

测试主函数

#include "linked_List.h"

int main()
{
	linked_List<int> s;
	cout << "第1次扫描输出链表内的元素" << endl;
	s.prt_linked_List();
	s.ins_linked_List(10,10);
	s.ins_linked_List(10,20);
	s.ins_linked_List(10,30);
	s.ins_linked_List(40,40);
	cout << "第2次扫描输出链表内的元素" << endl;
	s.prt_linked_List();
	if (s.del_linked_List(30))
		cout << "删除元素:30" << endl;
	else
		cout << "链表中无元素: 30" << endl;
	if (s.del_linked_List(50))
		cout << "删除元素:50" << endl;
	else
		cout << "链表中无元素: 50" << endl;
	cout << "第3次扫描输出链表内的元素" << endl;
	s.prt_linked_List();
	return 0;
}

运行结果

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值