线性表之链式存储--------单向链表

单向链表:是通过结点的形式在存储器中进行存储,结点包括数据域和指针域,逻辑上相邻的两个结点在物理上不一定相邻,单向链式存储的线性表,定义了一个唯一的头结点,头结点的next指针指向下一个结点,也就是开始结点;

单向链表代码如下:

SingleNode.h

#include <iostream>

using namespace std;

typedef int DataType; //定义用户存储的数据域类型
//构建一个结点类
typedef struct Node{
	DataType data;//存储数据域
	Node *next;//指针域
}Node;

//创建一个链表类
class ListNode{
public:	  
	ListNode();
	~ListNode();
public://相关操作
	void CreateLinkList(int n);//创建一个单链表
	void TravalLinkList();//遍历单链表
	int GetLength();//得到单链表的长度
	bool IsEmpty();//判断单链表是否为空
	Node *find(DataType data);//查找一个结点
	void InsertElemAtEnd(DataType data);//在尾部插入指定元素
	void InsertElemAtIndex(DataType data,int n);//在指定位置插入元素
	void InsertElemAtHead(DataType data);//在头部插入元素
	void DeleteElemEnd();//尾部删除元素
	void DeleteAll();//删除所有元素
	void DeleteElemAtPoint(DataType data);//删除指定元素
	void DeleteElemHead();//在头部删除结点
private:
	Node *head;
};

源文件如下:

#include "SingleNode.h"

using namespace std;

ListNode::ListNode(){
	head=new Node;
	head->next=NULL;
	head->data=0;
}

ListNode::~ListNode(){
	delete head;
}


void ListNode::CreateLinkList(int n){
	if (n<1)
	{
		cout<<"输入的结点个数有误,请重新输入!"<<endl;
		exit(OVERFLOW);
	}
	else
	{
       Node *pTemp=head,*pNew;
	   int i=n;
	   while(n-->0){
		   pNew=new Node;
		   pNew->next=NULL;
		   cout<<"请输入第"<<i-n<<"个结点值:";
		   cin>>pNew->data;
		   pTemp->next=pNew;
		   pTemp=pNew;
	   }
	}
}


void ListNode::TravalLinkList(){
	if (NULL==head->next)
	{
		cout<<"该链表为空!"<<endl;
		exit(EXIT_FAILURE);
	}else
	{
		Node *pTemp=head->next;
		while(NULL!=pTemp){
			cout<<pTemp->data<<endl;
			pTemp=pTemp->next;
		}
	}
}
int ListNode::GetLength(){
	if (NULL==head->next)
	{
		return -1;
	}
	else
	{
		int i=0;
		Node *pTemp=head->next;
		while(pTemp!=NULL){
			i++;
			pTemp=pTemp->next;
		}
		return i;//注意这个是栈中分配的内存 采用的是值 复制的模式返回
	}
}


bool ListNode::IsEmpty(){
	if (NULL==head->next)
	{
		return true;
	}else
	{
		return false;
	}
}

Node *ListNode::find(DataType data){
	if (NULL==head->next)
	{
		cout<<"该链表为空"<<endl;
		exit(EXIT_FAILURE);
	}
	else
	{
        Node *pTemp=head->next;
		while(pTemp!=NULL)
		{
           if (pTemp->data==data)
           {
			   return pTemp;
           }
		}
		return NULL;
	}
}


void ListNode::InsertElemAtEnd(DataType data){
	Node *pTemp=head->next,*pNew;
	pNew=new Node;
	int n=GetLength();
	for (int i=0;i<n;i++)
	{
		pTemp=pTemp->next;
	}
	pNew->next=NULL;
	pNew->data=data;
	pTemp->next=pNew;
}

void ListNode::InsertElemAtIndex(DataType data,int n){
	Node *pTemp=head->next,*pNew;
	pNew=new Node;
	for (int i=0;i<n;i++)
	{
		pTemp=pTemp->next;
	}
	pNew->data=data;
	pNew->next=pTemp->next;
	pTemp->next=pNew;
	
}

void ListNode::InsertElemAtHead(DataType data){
	Node *pTemp=head->next,*pNew;
	pNew=new Node;
	pNew->next=pTemp;
	pNew->data=data;
	head->next=pNew;
}

void ListNode::DeleteElemEnd(){
	Node *pTemp=head->next;
	int n=GetLength();
	for (int i=0;i<n;i++)
	{
		pTemp=pTemp->next;
	}
	delete pTemp;
	pTemp=nullptr;

}


void ListNode::DeleteAll(){
     Node *pTemp=head->next,*pDel;
	 int n=GetLength();
	 for (int i=0;i<n;i++)
	 {
		 pDel=new Node;
		 pDel=pTemp;
		 pTemp=pDel->next;
		 delete pDel;
		 pDel=NULL;
	 }
}

void ListNode::DeleteElemAtPoint(DataType data){
	Node *pTemp=head->next,*pDel;
	int n=GetLength();
	
	for (int i=0;i<n;i++)
	{
		if (pTemp->data==data)
		{
			pDel=new Node;
			pDel=pTemp;
			pTemp=pDel->next;
			delete pDel;
			pDel=nullptr;
		}
		else
			pTemp=pTemp->next;
	}

}

void ListNode::DeleteElemHead(){
	Node *pTemp=head->next,*pDel;
	pDel=new Node;
	pDel=pTemp;
	head->next=pTemp->next;
	delete pDel;
	pDel=NULL;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值