链表节点类化

 

用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;

}

转载于:https://www.cnblogs.com/sytu/p/3826185.html

<think>好的,我现在需要帮助用户解决关于C++中实现链表节点的问题。首先,用户提到了参考引用中的内容,其中引用[1]已经给出了一个链表节点的结构体示例。我需要确认用户的需求是否已经部分被满足,或者是否需要更详细的解释。 用户明确要求示例代码和数据结构相关的资料。根据引用[1],代码示例已经存在,但可能需要进一步解释。我需要检查示例代码的正确性,确保语法正确,比如结构体的定义、构造函数的使用,以及指针初始化是否正确。例如,Node结构体包含int型的data和指向下一个节点的指针next,构造函数使用初始化列表正确设置了data和next为nullptr。 接下来,用户可能需要了解如何在实际中使用这个节点,比如如何创建节点、链接节点等。我需要考虑是否添加一个链表的示例,如引用[1]中提到的“创建链表”,但用户主要问的是节点,所以可能需要分步骤解释节点的结构,然后简要说明如何将其用于构建链表。 同时,用户可能对C++中的struct和class的区别有疑问,因为节点通常可以用struct来定义,默认成员是public的,而class默认是private的。这里可能需要解释为什么使用struct而不是class,或者是否可以选择使用class。 另外,引用[2]提到C++ STL中的链表实现,但用户的问题是关于自己实现节点,所以需要区分标准库的实现和手动实现的区别。可能需要说明用户提供的示例是手动实现的基础节点结构,而STL的list是一个更复杂的双向链表,封装了更多功能。 然后,用户可能需要知道如何扩展这个节点,比如添加析构函数、处理内存管理等,但根据当前问题,可能不需要深入这些细节,除非用户后续提问。 最后,生成的相关问题需要围绕链表节点的实现,比如内存管理、STL的区别、构造函数的作用等。确保问题有针对性,帮助用户进一步学习。</think>以下是关于C++实现链表节点的详细说明和示例代码: ### 一、链表节点的实现步骤 1. **节点结构体定义** 使用`struct`定义节点,包含数据域和指针域: ```cpp struct Node { int data; // 存储数据 Node* next; // 指向下一个节点的指针 // 构造函数初始化数据域和指针域 Node(int val) : data(val), next(nullptr) {} }; ``` - `data`:存储节点值(示例中为`int`型,可按需修改为其他型) - `next`:指向下一个节点的指针,默认初始化为`nullptr`[^1] 2. **节点链表的关系** 节点链表的基础单元,链表通过操作节点指针实现功能: ```cpp class LinkedList { private: Node* head; // 链表头指针 public: LinkedList() : head(nullptr) {} // 后续可添加插入、删除等方法 }; ``` --- ### 二、关键点解析 1. **为什么用`struct`而不用`class`?** - `struct`默认成员为`public`,适合直接访问节点数据 - 若需要封装性,可用`class`并设置`public`访问权限 2. **构造函数的作用** - 确保新建节点时`next`指针总被初始化为`nullptr`,避免野指针问题 - 示例:`Node* newNode = new Node(10);` 会自动设置`data=10`, `next=nullptr` 3. **内存管理注意事项** - 动态创建的节点需手动释放:`delete node;` - 链表析构时应遍历所有节点释放内存 --- ### 三、完整示例代码 ```cpp #include <iostream> using namespace std; // 定义链表节点 struct Node { int data; Node* next; Node(int val) : data(val), next(nullptr) {} }; // 简单链表操作演示 int main() { // 创建三个节点并连接 Node* first = new Node(10); Node* second = new Node(20); Node* third = new Node(30); first->next = second; second->next = third; // 遍历链表 Node* current = first; while (current != nullptr) { cout << current->data << " -> "; current = current->next; } cout << "NULL" << endl; // 释放内存 delete third; delete second; delete first; return 0; } ``` 输出结果: `10 -> 20 -> 30 -> NULL` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值