C++链表类的基本实现

链表是学习数据结构最基本,最先学习的一种数据结构,熟练掌握链表是必须的!

实现:用类封装一个通用链表,实现增,删,修,查等操作。以存储int为例,并具有自动排序,反转功能!!

#include <iostream>
#include <stdio.h>
#include <string>
using namespace std;

class List
{
private:
 struct Notelist
 {
  int m_data;
  Notelist *next;
 };
 Notelist *phead;
public:
 List()
 {
  phead = NULL;
 }


 ~List()
 {
  if(phead != NULL || pcount != NULL)
  {
   delete phead;
   phead = NULL;
  }
 }
//添加链表元素:分第一次添加,得到头结点 和 之后添加
//有序排列(升序)
 void Insert(int &data)
 {
 Notelist *pcur;
 pcur = new Notelist;
 if(phead == NULL)
 {
   pcount = new Notelist;
   phead = pcur;
   phead->m_data = data;
   phead->next = NULL;
   pcount = phead;
  }
  else
  {
    Notelist *p = NULL,*p1 = NULL;
    if(phead->m_data >= data)
    {
    pcur->next = phead;
    pcur->m_data = data;
    phead = pcur;
    }
    else
    {
     p1 = phead;
     p = p1->next;
     while(p != NULL)
     {
      if(p->m_data >= data)
      {  
      pcur->m_data = data;
      p1->next = pcur;
      pcur->next = p;
      break;
      }
      p1 = p;
      p = p->next;
     }
     pcur->m_data = data;
     p1->next = pcur;
     pcur->next = NULL;
  }
 }
 }
//遍历链表
 void Look()
 {
  Notelist *p = phead;
  while(p != NULL)
  {
   printf("%d ",p->m_data);
   p = p->next;
  }
  cout << " " << endl;
 }
//链表反转:将链表中的结点一个个取出,记住当前结点和下一个结点。
 void Changed()
 {
  Notelist *p,*p1;
  if(phead != NULL && phead->next != NULL)
  {
  p = phead;
  phead = NULL;
  while(p != NULL)
  {
   p1 = p->next;
   p->next = phead;
   phead = p;
   p = p1;
  }
  }
 }
//删除结点,分三种情况:头结点,尾结点,中间结点
 void Del(int &data)
 {
 Notelist *p = phead;
 if(p->m_data == data)
 {
  phead = phead->next;
  delete p;
 }
 else
 {
   Notelist *p1 = NULL;
   while(p != NULL)
   {
   p1 = p;
   p = p->next;
   if(p != NULL && p->m_data == data)
   {
    if(p->next == NULL)
    {
     p1->next = NULL;
     break;
    }
       p1->next = p->next;
    break;
   }
  }
 }
 }
};

 

面向对象程序设计课程作业 1. 请创建一个数据型为T的链表模板List实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该模板的正确性: 1) 用List模板定义一个List型的模板对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List型的模板对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List型的模板对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List型的模板对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值