您的位置:首页 > 理论基础 > 数据结构算法

数据结构:线性表的链式存储结构_单链表

2015-06-11 15:08 357 查看

1.单链表的存储结构定义

单链表:由n个结点链接成的,结点由数据域和指针域两部分组成,指针指向链表的下一个结点。

头指针:我们把链表中的第一个结点的存储位置,整个链表的存取就必须是从头指针开始进行了。同时,我们规定链表的最后一个结点的指针域为NULL。

头结点:有时为了操作方便,会在单链表的第一个结点前附设一个结点,该节点就是头结点。头结点的数据域可以不存储任何信息,也可存储如线性表长度等附加信息,头结点的指针域指向第一个结点的指针。

2.头指针和头结点的连续

头指针是指链表指向第一个结点的指针,若链表有头结点,则是指向头结点的指针。具有标识作用,所以常用头指针来表示链表的名字。无论链表是否为空,头指针均不为空。头指针是链表的必要元素

头结点是为了操作的统一和方便而设立的,放在第一元素的结点之前,其数据域一般无意义。有了头结点,对在第一元素结点前插入结点和删除第一结点,其操作与其他结点的操作就统一了。头结点不是链表的必要元素

3.单链表的基本操作

存储结构的定义和函数的声明

//线性表的单链表存储结构
struct ListNode
{
	int m_nValue;
	ListNode* m_pNext;
};

//创建一个结点
ListNode* CreateListNode(int value);

//连接结点
void ConnectListNodes(ListNode* pCurrent, ListNode* pNext);

//尾部插入一个结点
void AddToTail(ListNode** pHead,int value);

//删除一个结点
void RemoveNode(ListNode** pHead,int value);

//打印结点
void PrintListNode(ListNode* pNode);

//打印链表
void PrintList(ListNode* pHead);

//销毁链表
void DestroyList(ListNode* pHead);

函数的定义

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

//创建一个结点
ListNode* CreateListNode(int value)
{
	ListNode* pNode=new ListNode();
	if(pNode==NULL)
	{
		cout<<"创建结点失败!"<<endl;
		return NULL;
	}
	pNode->m_nValue=value;
	pNode->m_pNext=NULL;
	return pNode;
}

//连接结点
void ConnectListNodes(ListNode* pCurrent, ListNode* pNext)
{
	if(pCurrent==NULL)
	{
		cout<<"当前结点不存在!"<<endl;
		return;
	}
	pCurrent->m_pNext=pNext;
}

//尾部插入节点
void AddToTail(ListNode** pHead,int value)
{
	if(pHead==NULL)
		return;
	ListNode* pNew=new ListNode();
	pNew->m_nValue=value;
	pNew->m_pNext=NULL;
	if(*pHead==NULL)
		*pHead=pNew;
	else
	{
		ListNode* pNode=*pHead;
		while(pNode->m_pNext!=NULL)
			pNode=pNode->m_pNext;
		pNode->m_pNext=pNew;
	}
}

//删除一个结点
void RemoveNode(ListNode** pHead,int value)
{
	if(pHead==NULL||*pHead==NULL)
		return;
	if((*pHead)->m_pNext==NULL&&(*pHead)->m_nValue==value)//一个结点
	{
		delete (*pHead);
		*pHead=NULL;
		return;
	}
	ListNode* pToBeDeleted;
	ListNode* pNode=*pHead;
	while(pNode->m_pNext->m_pNext!=NULL)
	{
		if(pNode->m_pNext->m_nValue!=value)
			pNode=pNode->m_pNext;
		else
		{
			pToBeDeleted=pNode->m_pNext;
			pNode->m_pNext=pNode->m_pNext->m_pNext;
			delete pToBeDeleted;
			pToBeDeleted=NULL;
			return;
		}
	}
}

//打印结点
void PrintListNode(ListNode* pNode)
{ 
    if(pNode == NULL)
    {
        cout<<"结点为空!"<<endl;
    }
    else
    {
        cout<<"结点值为:"<< pNode->m_nValue<<endl;
    }
}

//打印链表
void PrintList(ListNode* pHead)
{
    cout<<"开始打印链表"<<endl;
    
    ListNode* pNode = pHead;
    while(pNode != NULL)
    {
        cout<<pNode->m_nValue<<" ";
        pNode = pNode->m_pNext;
    }

    cout<<"打印链表结束"<<endl;
}

//销毁链表
void DestroyList(ListNode* pHead)
{
	if(pHead==NULL)
		return;
	ListNode* pCur=pHead;
	while(pCur!=NULL)
	{
	  pHead=pHead->m_pNext;
	  delete pCur;
	  pCur=pHead;
	}
}


这些代码是我也是参考了很多资料的,如有问题大家可以发评论,我们共同交流。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: