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

数据结构练习——简单单链表

2017-12-21 10:11 573 查看
头文件1:NodeStruct.h

//为了防止重定义结构体
#ifndef _NODESTRUCT_H_
#define _NODESTRUCT_H_

#include<stdio.h>
//单向链表节点数据结构
typedef struct ListNode {
int NodeNum;
ListNode* next;
}Listnode, *pListnode;

#endif // !_NODESTRUCT_H
头文件2:CSingalList.h

#pragma once
#include"NodeStruct.h"
#include<iostream>

//单链表类
//这个类中有会有两条链表:一条由头插法构建,一条由尾插法构建;
//尾插法构建链表时,采用了多建了一个头监督节点方式,为了方便。

class CSingalList
{
public:
CSingalList();
~CSingalList();

public:

/****************************************
//模式1:可以直接提出当作C中的功能函数使用
******************************************/

//头插法加入一个节点
pListnode HeadInsertNode(pListnode phead,int item);

pListnode InitTailList();

//尾插法加入一个节点
pListnode TailInsertNode(pListnode pfoot, int item);

//遍历输出单链表的所有节点
void TraversalList(pListnode phead);

//遍历删除单链表的所有节点
void CleanList(pListnode phead);

public:

/****************************************
//模式2:涉及类中的成员变量,无法直接提出去使用
******************************************/

//头插法加入一个节点(用到了类中的成员变量)
void HeadInsertNodeFun( int item);

//初始化 尾插法构造链表[主要是为了构造 一个头节点]
void InitTailListFun();

//尾插法加入一个节点(用到了类中的成员变量)
void TailInsertNodeFun( int item);

//遍历输出单链表的所有节点
void TraversalListFun(pListnode phead);

//遍历删除单链表的所有节点
void CleanListFun(pListnode phead);

public:

pListnode m_HeadListHead;//头插法构造链表的头节点[随着新插入节点而动态向后移动]

pListnode m_TailListHead;//尾插法构造链表的头节点
pListnode m_TailListFoot;//尾插法构造链表的尾节点 [随着新插入节点而动态向后移动]

};
cpp文件  CSingalList.cpp#include "stdafx.h"#include "CSingalList.h"CSingalList::CSingalList(){m_HeadListHead = NULL;m_TailListHead = NULL;m_TailListFoot = NULL;}CSingalList::~CSingalList(){}pListnode CSingalList::InitTailList(){pListnode temp = new Listnode();temp->NodeNum = -1;temp->next = NULL;return temp;}void CSingalList::InitTailListFun(){if (m_TailListHead)return ;//为这个尾插法链表开辟一个头节点m_TailListHead = new Listnode;m_TailListHead->NodeNum = -1;m_TailListHead->next = NULL;m_TailListFoot = m_TailListHead;}pListnode CSingalList::TailInsertNode(pListnode pfoot, int item){if (NULL == pfoot) {std::cout << "尾插法链表的头尚未初始化开辟成功" << std::endl;return NULL;}pListnode m_TempNode = new Listnode();m_TempNode->NodeNum = item;m_TempNode->next = NULL;pfoot->next = m_TempNode;pfoot = m_TempNode;return pfoot;}void CSingalList::TailInsertNodeFun(int item){if (NULL == m_TailListFoot) {std::cout << "尾插法链表的头尚未初始化开辟成功,请先调用初始化" << std::endl;return ;}pListnode m_TempNode = new Listnode();m_TempNode->NodeNum = item;m_TempNode->next = NULL;m_TailListFoot->next = m_TempNode;m_TailListFoot = m_TempNode;}void CSingalList::TraversalList(pListnode phead){while (phead) {std::cout << phead->NodeNum << " --> ";phead = phead->next;}std::cout << "NULL" << std::endl;}void CSingalList::TraversalListFun(pListnode phead){while (phead) {std::cout << phead->NodeNum << " --> ";phead = phead->next;}std::cout << "NULL" << std::endl;}void CSingalList::CleanList(pListnode phead){pListnode temp = NULL;while (phead) {temp = phead;phead = phead->next;delete temp;temp = NULL;}}void CSingalList::CleanListFun(pListnode phead){pListnode temp = NULL;while (phead) {temp = phead;phead = phead->next;delete temp;temp = NULL;}}pListnode CSingalList::HeadInsertNode(pListnode phead, int item) {pListnode m_TempNode = new Listnode();m_TempNode->NodeNum = item;m_TempNode->next = phead;phead = m_TempNode;return phead;}void CSingalList::HeadInsertNodeFun(int item){pListnode m_TempNode = new Listnode();m_TempNode->NodeNum = item;m_TempNode->next =m_HeadListHead;m_HeadListHead = m_TempNode;}
测试程序cpp  入口#include "stdafx.h"#include"CSingalList.h"int main(){//*****************************//模式1:C语言模式//通过调用一个个独立的子函数来实现每一项功能//区别:虽然模式1中调用的功能函数都是类中的,但并没有和类的成员变量产生交集,可以直接摘出来使用//****************************CSingalList m_SingaList;int i, j;//外部调试观看用的指针pListnode m_pHListhead = NULL;//头插法链表的头节点指针pListnode m_pTListhead = NULL;//尾插法链表的头节点指针pListnode m_pTListfoot = NULL;//尾插法链表的尾节点指针//1.构造头插法链表for (i = 0; i < 3; i++) {m_pHListhead = m_SingaList.HeadInsertNode(m_pHListhead, i);}std::cout << "模式1构造的头插法链表如下图示:" << std::endl;m_SingaList.TraversalList(m_pHListhead);m_SingaList.CleanList(m_pHListhead);//2.构造尾插法链表m_pTListhead = m_SingaList.InitTailList();//得到刚初始化后的尾插链表的尾节点指针备份m_pTListfoot = m_pTListhead;//得到刚初始化后的尾插链表的头节点指针备份for (j = 0; j < 3; j++) {m_pTListfoot = m_SingaList.TailInsertNode(m_pTListfoot, j);}std::cout << std::endl << "模式1构造的尾插法链表如下图示:" << std::endl;m_SingaList.TraversalList(m_pTListhead);m_SingaList.CleanList(m_pTListhead);system("pause");return 0;}
int main(){//*****************************//模式2:C++模式//通过调用类中的成员函数来实现每一项功能//区别:成员函数中直接使用了成员指针变量,这个变量在这个类失效之前一直都存活并记录值的更改//****************************CSingalList m_SingaList;int i, j;//1.构造头插法链表for (i = 0; i < 3; i++) {m_SingaList.HeadInsertNodeFun(i);}std::cout << std::endl << "模式2构造的头插法链表如下图示:" << std::endl;m_SingaList.TraversalListFun(m_SingaList.m_HeadListHead);m_SingaList.CleanListFun(m_SingaList.m_HeadListHead);//2.构造尾插法链表m_SingaList.InitTailListFun();for (int j = 0; j < 3; j++) {m_SingaList.TailInsertNodeFun(j);}std::cout << std::endl << "模式2构造的尾插法链表如下图示:" << std::endl;m_SingaList.TraversalListFun(m_SingaList.m_TailListHead);m_SingaList.CleanListFun(m_SingaList.m_TailListHead);system("pause");return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: