数据结构之单链表实现

使用头文件定义两个类,IntSLNode是表中的节点,另一个是IntSLList用于访问链表

IntSLList.h

#ifndef INT_LINKED_LIST
#define INT_LINKED_LIST

class IntSLNode {
public:
	IntSLNode() {
		next = 0;
	}
	IntSLNode(int e1, IntSLNode*ptr = 0) {
		info = e1;
		next = ptr;
	}
	int info;
	IntSLNode*next;
};

class IntSLList {
public:
	IntSLList() {
		head = tail = 0;
	}
	~IntSLList();
	int isEmpty() {
		return head == 0;
	}
	void addToHead(int);
	void addToTail(int);
	//删除头节点并且返回其数值
	int deleteFromHead();
	//删除尾节点并且返回其数值
	int deleteFromTail();
	void deleteNode(int);
	bool isInList(int) const;
private:
	IntSLNode*head, *tail;
};

#endif // 
IntSLList.cpp

// c++_test.cpp : 定义控制台应用程序的入口点。
//
#include<iostream>
#include"IntSLList.h"

//删除链表
IntSLList::~IntSLList() {
	for (IntSLNode*p; !isEmpty();) {
		p = head->next;
		delete p;
		head = p;
	}
}
//添加元素到头部
void IntSLList::addToHead(int e1) {
	head = new IntSLNode(e1, head);
	if (tail == 0) {
		tail = head;
	}
}
//添加元素到尾部
void IntSLList::addToTail(int e1) {
	if (tail != 0) {   //如果链表非空
		tail->next = new IntSLNode(e1);
		tail = tail->next;
	}
	else {
		head = tail = new IntSLNode(e1);
	}
}

//从链表头部开始删除数据
int IntSLList::deleteFromHead() {
	int e1 = head->info;
	IntSLNode*tmp = head;
	if (head == tail) {    //如果链表中只有一个节点
		head = tail = 0;
	}
	else {
		head = head->next;
	}
	delete tmp;
	return e1;
}

//从链表尾部开始删除数据
int IntSLList::deleteFromTail() {
	int e1 = tail->info;
	if (head == tail) {
		delete head;
		head = tail = 0;
	}
	else {
		IntSLNode*tmp;
		for (tmp = head; tmp->next != tail; tmp = tmp->next);
		delete tail;
		tail = tmp;
		tail->next = 0;
	}
	return e1;
}
//删除特定节点
void IntSLList::deleteNode(int e1) {
	if(head!=0)
		if (head == tail&&e1 == head->info) {
			delete head;
			head = tail = 0;
		}
		else if (e1 == head->info) {
			IntSLNode*tmp = head;
			head = head->next;
			delete tmp;
		}
		else {
			IntSLNode*pred, *tmp;
			for (pred = head, tmp = head->next; tmp != 0 && 
				!(tmp->info = e1); pred = pred->next, tmp = tmp->next);
			if (tmp != 0) {
				pred->next = tmp->next;
				if (tmp == tail)
					tail = pred;
				delete tmp;
			}
		}
}

bool IntSLList::isInList(int e1) const {
	IntSLNode*tmp;
	for (tmp = head; tmp != 0 && !(tmp->info == e1); tmp = tmp->next);
	return tmp != 0;
}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值