链表节点类化

用c++类将单向链表类化,保存后可以方便的进行数的排序,插入操作; 调试成功的!

#include using namespace std;

class ListNode//创造节点成分

{

public:

ListNode(int datavalue)//构造函数一

{ value=datavalue; }

ListNode()//构造函数二

{ }

int value;//节点的值

ListNode *previous;//上一个节点的指针

ListNode *next;//下一个节点的指针

ListNode operator=(const ListNode *LN)//定义此类的等号重载

{

value=LN->value;

previous=LN->previous;

next=LN->next;

}

};

class List//创造链表,使用ListNode节点

{

public:

List()//构造函数初始化对象

{

head=NULL;

tail=NULL;//将头部和尾部的指针指向空

listcount=0;//将节点的数量初始化为零

current=NULL;//现在操作的节点位置,初始化为空

}

int listcount;//定义节点个数的记录变量

ListNode *head;//定义头指针

ListNode *tail;//定义尾指针

ListNode *current;//定义现在操作的指针

void MoveHead();//移动到头部

void MoveTail();//移动到尾部;

void MoveNext();//移动到下一个;

void MoveFore();//向上一个移动一个位置

void Append(int);//在整个链表后面添加新数据

void Insert(int);//在正在操作的数据的前面添加新数据

bool IsNull();//判断链表是否为空

bool IsBof();//判断当前操作的current指针是否在头部

bool IsEof();//判断当前操作的current指针是否在尾部

int GetCurrent();//得到当前操作指针current指向的value的值

void InsertAscend(int);//按照升序方式插入

void InsertDescend(int);//降序插入

void PrintAll();//从头到尾输出所有数据到屏幕

};

//下面是所有函数的具体内容

void List::MoveHead()

{

current=head;//令current指针指向头指针

}

void List::MoveTail()

{

current=tail;//令current指针指向尾指针

}

void List::MoveFore()//向上一个移动一个位置

{

if(!IsBof())//判断是否此时指针在头部,如果在就不移动,不在向上移动

{

current=current->previous;

}

}

void List::MoveNext()//向下一个移动一个位置

{

if(!IsEof())//判断是否此时指针在尾部,如果不在才可向后移动

{ current=current->next; }

}

void List::Append(int datavalue)//在整个链表的最后添加数据

{

ListNode *newnode=new ListNode;//开辟新节点

newnode->value=datavalue;//将参数付给新节点

if(IsNull())//判断此链表是否为空,若为空就直接加上这个数据

{

head=newnode;//头指针指向新节点

tail=newnode;//尾指针也指向新节点

tail->next=NULL;//尾指针指向空

head->previous=NULL;//头指针的保存上一个节点的应指向空

current=tail;//现在操作的指针的指向新加的数据

listcount++;//新增一个数

}

else//如果不为空,就在尾部添加

{

tail->next=newnode;//在尾部添加,直接使尾指针指向新节点

newnode->previous=tail;//不要忘记将新节点的指向前一个节点的指针赋值

tail=newnode;//时尾指针后移 tail->next=NULL; current=tail; listcount++;

}

}

void List::Insert(int datavalue)//注意是在当前操作的值前加新节点

{

ListNode *newnode=new ListNode;

newnode->value=datavalue;

if(IsNull())//此处同上

{

head=newnode;

tail=newnode;

tail->next=NULL;

head->previous=NULL;

current=head; listcount++;

}

else if(IsBof())//判断当前操作指针current是否为在头指针位置

{ newnode->next=head;//让新节点指向头节点

head->previous=newnode;

newnode->previous=NULL;

head=newnode;

current=head;//更新操作节点的指针值

}

else //在当前操作指针current前加新节点

{

newnode->next=current;

current->previous->next=newnode;

newnode->previous=current->previous;

current->previous=newnode;

current=newnode;

listcount++;

}

}

bool List::IsNull()//判断是否为空的函数

{

if(listcount==0)

return true;

return false;

}

bool List::IsBof()//判断是否为头指针

{

if(current==head)

return true;

return false;

}

bool List::IsEof()//判断是否为尾指针

{

if(current==tail)

return true;

return false;

}

int List::GetCurrent()//获取当前操作值的值

{ return current->value; }

void List::InsertAscend(int datavalue)//按照升序插入新数据

{

ListNode *newnode=new ListNode;

newnode->value=datavalue;

if(IsNull())

{

head=newnode;

tail=newnode;

tail->next=NULL;

head->previous=NULL;

current=head;

listcount++;

}

else if(head->value>datavalue)//判断头指针是否大于新节点值,如果大于,则就可以将新节点直接插在头部前面

{

MoveHead();//将指针移向头部

Insert(datavalue);//使用了上面的插入函数

}

else if(tail->value<datavalue)//判断头指针是否大于新节点值,如果大于,则就可以将新节点直接插在头部前面

{ MoveTail();

Append(datavalue);

}

else if(GetCurrent()>datavalue)//如果当前操作值大于新节点值

{

while(GetCurrent()>datavalue)

{ MoveFore();//向上走一个指针

}

MoveNext();//因为此时指针指向的值小于新节点,这也是上面循环跳出的原因,所以应该再将指针后移一个位置

Insert(datavalue);

}

else

{

while(GetCurrent()<=datavalue)//如果此时current指针指向的值小于新节点值

{ MoveNext();//就向后移动一个指针,直到找到第一个比它大的值

}

Insert(datavalue);//在找到的第一个比他大的值前面插入

}

}

void List::InsertDescend(int datavalue)//按照降序插入,分析类似于上面升序插入

{ ListNode *newnode=new ListNode;

newnode->value=datavalue;

if(IsNull())

{ head=newnode;

tail=newnode;

tail->next=NULL;

head->previous=NULL;

current=head;

listcount++;

}

else if(tail->value>datavalue)

{

MoveTail();

Append(datavalue);

}

else if(head->value<datavalue)

{ MoveHead();

Insert(datavalue); }

else if(GetCurrent()>datavalue)

{ while(GetCurrent()>datavalue)

{ MoveNext(); }

Insert(datavalue);

}

else { while(GetCurrent()<=datavalue)

{ MoveFore(); }

MoveNext();//降序插入和升序插入在这个位置 是否需要回走一个指针有差别,细心分析

Insert(datavalue);

}

}

void List::PrintAll()//打印所有数据

{ MoveHead();

int i=0;

while(current!=NULL)

{ if(i>7)

{

i=0;

cout<<endl;

}

if(i>0)

cout<<" ";

cout<<(current->value);

current=current->next;

i++; }

}

//一个使用这个l类函数的例子

int main()

{

  //freopen("classdata.txt","r",stdin);

    List Num;

      int i,n;

    cin>>n;

for(i=0;i<n;i++)

{

int t;

cin>>t;

Num.InsertDescend(t);

}

Num.PrintAll();

return 0;

}

链表节点类化,布布扣,bubuko.com

时间: 2024-12-19 06:01:53

链表节点类化的相关文章

[数据结构]线性表之单链表的类模板实现

类的具体实现如下: ///////////////////////// #include"LinearList.h" #include <iostream> #include <cstdlib> using namespace std; template<class T> struct LinkNode //链表节点类 { T data; LinkNode<T>* link; LinkNode(LinkNode<T>* ptr

C++中的链表节点用模板类和用普通类来实现的区别

C++中的链表节点通常情况下类型都是一致的.因此我们可以用模板来实现. #include <iostream> using namespace std; template<typename Type>//定义一个模板类必须有的声明 class LinkNode //表示链表节点的类 { public: LinkNode() :m_pnext(nullptr){}//构造函数,在函数体内实现的相当于默认在前面加了inline关键字修饰 LinkNode(Type item, Link

C语言实现非循环双链表节点的删除(不带头结点)

不带头结点的非循环双链表在删除节点的时候比价麻烦,因为同时要维护prior和next两个指针.在处理第一个节点和最后一个节点的时候都要分别考虑,同时也需要考虑节点数量为1的情况.删除情况分为下面两类: (1)删除pos位置的节点: (2)判断x是否在链表中,若存在则删除: 代码上传至 https://github.com/chenyufeng1991/DeleteNodeDoubleList  . 核心代码如下: //删除pos位置的节点 Node *deletePosList(Node *pN

[数据结构]二叉树之二叉链表的类模板实现

该类模板实现了一个二叉树的模板类,采用二叉链表实现. 定义二叉树节点类,采用二叉链表实现. ///////////////////////// #include <iostream> #include <cstdlib> #include <stack> #include <deque> using namespace std; template<class T> struct BinTreeNode //二叉树节点类的定义,使用二叉链表 { T

C语言实现单链表节点的删除(带头结点)

我在之前一篇博客<C语言实现单链表节点的删除(不带头结点)>中具体实现了怎样在一个不带头结点的单链表的删除一个节点,在这一篇博客中我改成了带头结点的单链表.代码演示样例上传至 https://github.com/chenyufeng1991/DeleteLinkedList_HeadNode.删除类型有两种: (1)删除某个位置pos的节点: (2)推断x值是否在链表中,若存在则删除该节点: 核心代码例如以下: //删除某个位置pos的节点 Node *DeletePosNode(Node

C语言实现链表节点的插入

对链表进行增删改查是最基本的操作.我在上一篇博客<C语言实现链表节点的删除>实现了删除链表中的某个节点.这里我们要来实现在某个位置插入节点.示例代码上传至https://github.com/chenyufeng1991/InsertList  . 核心代码如下: Node *InsertToPosition(Node *pNode,int pos,int x){ if (pos < 0 || pos > sizeList(pNode) ) { printf("%s函数执

剑指offer—第三章高质量代码(o(1)时间删除链表节点)

题目:给定单向链表的头指针和一个节点指针,定义一个函数在O(1)时间删除该节点,链表节点与函数的定义如下:struct ListNode{int m_nValue;ListNode* m_pValue;};void DeleteNode(ListNode** pListNode,ListNode * pToBeDeleted){} 思路:将要删除的节点的下一个节点的值赋值给i,删除下一个节点,但要考虑到删除的节点是最后一个节点并且该链表不止有一个节点的情况和该链表只有一个节点,该节点既是头节点也

lintcode 容易题:Delete Node in the Middle of Singly Linked List 在O(1)时间复杂度删除链表节点

题目: 在O(1)时间复杂度删除链表节点 给定一个单链表中的表头和一个等待被删除的节点(非表头或表尾).请在在O(1)时间复杂度删除该链表节点.并在删除该节点后,返回表头. 样例 给定 1->2->3->4,和节点 3,返回 1->2->4. 解题: 方法好贱,先把要删除节点后面一个节点的值赋给删除节点,这样需要删除节点就删除了,再把删除节点指向删除节点后面节点的节点 就像这样: node.val = node.next.val; node.next = node.next.

详说大数据计算的可类化Classable

可类化(Classable)是Laxcus大数据管理系统提供的一项基础功能,它能够将类转化为一串字节数组,或者逆向将字节数组转化为一个类.这项功能与JAVA提供的序列化(Serializable)非常相似,但是不同之处在于,可类化是可以由用户自己定义的,包括数据的选择.数据的样式.数据结构等一系列的规则. 这样的好处在于,我们摆脱了JAVA序列化的那种由系统硬性规定的固定格式,可以自由组织我们需要的数据,包括一些可能是私密的数据:不便在于,因为这种自由,程序员需要做些牺牲,编写代码来实现这项技术