c++实现单链表、链式存储不带头节点

LinkList.h

#pragma once
#include<iostream>
using namespace std;
#include<string>
#include <fstream>

struct Node
{
	int data;
	Node* next;
};

class LinkList
{
private:
	Node* head;
public:
	LinkList();
	LinkList(string fname);// 通过文件初始化链表,尾插法
	LinkList(int array[],int n);
	void ShowAll();
	void HeadAfterInert(int e);
	Node* SearchNode(int e);


	void InsertAfterNode(Node *node,int e); // 指定结点后插入数据
	void RemoveNode(Node *node);
	void RemoveAfterNode(Node* node);// 删除指定节点的后继节点
	void RemoveHeadAfterNode(); // 删除头指针后的第一个节点

	void SearchRemove(int e);// 查找删除

};


LinkList.cpp

#include "LinkList.h"

LinkList::LinkList()
{
	// 表示空链表
	head = NULL; // 这里的head表示 头指针; 而不是  头结点指针 ( 不带头结点 )
}
LinkList::LinkList(string fname)
{
	head = NULL;
	ifstream fin(fname);
	int n;
	fin >> n;
	Node* tail = NULL;
	for (int i = 0; i < n; i++)
	{
		int data;
		fin >> data;
		
		Node* p = new Node();
		p->data = data;
		p->next = NULL;

		if (head == NULL)
			head = p;
		else
			tail->next = p;
		tail = p;
	}

	fin.close();
}
LinkList::LinkList(int array[],int n)
{
	head = NULL;
	for (int i = 0; i < n; i++)
	{
		HeadAfterInert(array[i]);
	}
}

void LinkList::ShowAll()
{
	Node* p = head;
	while (p!=NULL)
	{
		cout << p->data << " ";
		p = p->next;
	}
	cout << endl;
}

// 在链表头进行后插操作
void LinkList::HeadAfterInert(int e)
{
	Node* p = new Node();
	p->data = e;
	if (head == NULL) // 不带头结点的单链表,如果当前链表为空,则需要特殊关注
	{
		p->next = NULL;
		head = p;
		return;
	}

	p->next = head;
	head = p;
}

Node* LinkList::SearchNode(int e)
{
	Node* p = head;
	while (p != NULL)
	{
		if (p->data == e)
			return p;
		p = p->next;
	}
	return NULL;
}

// 删除指定结点的后继结点
void LinkList::RemoveAfterNode(Node* node)
{
	Node* p = node;
	if (p->next != NULL)
	{
		Node* d = p->next;
		p->next = d->next;
		delete(d);
	}
}

// 删除 头指针后 的第一个节点
void LinkList::RemoveHeadAfterNode()
{
	Node* p = head->next;
	head->next = p->next;
	delete(p);
}

// 指定节点后插入
void LinkList::InsertAfterNode(Node* node, int e)
{
	Node* p = new Node();
	p->data = e;
	p->next = node->next;
	node->next = p;
}

// 删除指定结点
void LinkList::RemoveNode(Node *node)
{
	Node* prev = NULL, * p = head;
	
	if (p == NULL)
		return;

	while (p!=NULL)
	{
		if (p == node)
			break;
		prev = p; // 每次prev记录的是上一个结点
		p = p->next;
	}
	if (prev != NULL)
		prev->next = p->next;
	else
		head = p->next; // 如果prev为NULL,则第一个结点就是需要删除的结点
	delete(p);
}

// 查找删除
void LinkList::SearchRemove(int e)
{
	Node * p = SearchNode(e);
	RemoveNode(p);
}

main.cpp

#include<iostream>
using namespace std;
#include"LinkList.h"


int main()
{
	//int array[] = { 1,2,3,4,5,6,7,8,9,10 };
	//int n = 10;
	LinkList L("data.txt");
	L.ShowAll();

	Node *p = L.SearchNode(9); // 按值查找结点
	cout << p->data << endl;

	L.RemoveAfterNode(p);// 删除该结点的后继结点,存在的情况下
	L.ShowAll();


	L.RemoveNode(p);
	L.ShowAll();

	p = L.SearchNode(4);
	L.InsertAfterNode(p, 200); // 在指定结点后插入数据
	L.ShowAll();

	L.SearchRemove(200);
	L.ShowAll();
	return 0;
}

在这里插入图片描述

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值