数据结构课设个人(十):判断单链表的对称性

这篇博客介绍了如何使用C++实现一个基于模板的链表数据结构,并提供了一个判断链表前n个节点是否中心对称的算法。示例代码展示了如何创建、遍历链表以及判断对称性,适用于不同数据类型(整型、双精度浮点型、字符型和字符串)。输入输出格式详细说明了数据类型和链表元素,以及如何进行测试。
摘要由CSDN通过智能技术生成

问题描述 :

设带头结点的单链表的头指针为head,结点结构由data和next两个域构成,其中data域为字符型。在使用单链表ADT的基础上,设计一算法判断该链表的前n个字符是否中心对称。例如 xyx, xyyx都是中心对称。

参考函数原型:

//判断单链表的前n个结点是否中心对称

template<class ElemType>

bool Judge_Symmetry( LinkList<ElemType> &L, int num );

输入说明 :

第一行:顺序表A的数据元素的数据类型标记(0:int,1:double,2:char,3:string)

第二行:单链表A的数据元素(数据元素之间以空格分隔)

第三行:待判断对称性的链表长度

输出说明 :

如第一行输入值为0、1、2、3之外的值,直接输出“err”

否则:

第一行:单链表A的遍历结果(数据元素之间以"->"分隔)

空行

第三行:true(对称)

false(不对称)

输入范例 :

2
10
A B C D E E D C B A X Y

输出范例:

A->B->C->D->E->E->D->C->B->A->X->Y

true

代码实现:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <iomanip>
#include <stdlib.h>
#include <cmath>
#include <vector>
#include <sstream>   //用于ostringstream、istringstream、stringstream这三个类
#include<stack>
#include<vector>
#include<queue>
#include<list>
using namespace std;
template<class ElemType>
struct LinkNode
{
    ElemType data;
    LinkNode<ElemType> *next;
    LinkNode(LinkNode<ElemType> *ptr = NULL){next = ptr;}
    LinkNode(const ElemType &item, LinkNode<ElemType> *ptr = NULL)
    //函数参数表中的形参允许有默认值,但是带默认值的参数需要放后面
    {
        next = ptr;
        data = item;
    }
};
template <class ElemType>
class LinkList:public LinkNode<ElemType>
{
   private:
      LinkNode<ElemType>*head;   // 头指针
      LinkNode<ElemType>*tail;   // 尾指针
   public:
      //无参数的构造函数
      LinkList<ElemType>(){head = new LinkNode<ElemType>; head->next=NULL;tail =head;}
      //带参数的构造函数
      LinkList(const ElemType &item)
      {
          head = new LinkNode<ElemType>;
           LinkNode<ElemType>*p=new LinkNode<ElemType>;
           p->data=item;
          head->next=p;
          tail = p;
      }
      //析构函数
      ~LinkList(){delete head;}
      //重载函数:赋值
      //返回链表的长度
      int ListLength() const;
      //获取链表头指针
      LinkNode<ElemType>* GetHead() const{ return head;}
      //获取链表尾指针
      LinkNode<ElemType>* GetTail() const{ return tail;}
      //设置链表头指针
      void SetHead(LinkNode<ElemType>*p){ head = p;}
      //设置链表尾指针
      void SetTail(LinkNode<ElemType>*p){ tail = p;}
       //遍历链表
        bool ListTraverse() const{
      LinkNode<ElemType>*p=head->next;
      if(p){ cout<<p->data;  p=p->next;}
      while(p){
        cout<<"->"<<p->data;
        p=p->next;
      }
      }
      void Insert_tail(ElemType num)//表尾插入法动态生成链表
      {
          LinkNode<ElemType>* p = new LinkNode<ElemType>(num);
          tail->next=p;
           tail=p;
      }
};
template<class ElemType>
void createlinklist( LinkList<ElemType> &A){
    ElemType num;
    while(cin>>num)
        A.Insert_tail(num);
}
//判断单链表的前n个结点是否中心对称
template<class ElemType>
bool Judge_Symmetry( LinkList<ElemType> &L, int num ){
    L.ListTraverse();
    cout<<endl<<endl;
    LinkNode<ElemType>* findhead=L.GetHead()->next;
    vector<ElemType>A;
    int half=num/2;
    for(int i=0;i<half;i++){  //前一半保存到数组中
         A.push_back(findhead->data);
         findhead=findhead->next;
    }//出for循环时,findhead指向第half+1各元素;
    if(num%2==1)//待判断的单链表长度为奇数
        findhead=findhead->next;
    int flag=1;
    for(int i=half-1;i>=0;i--){
        if(findhead->data!=A[i])  { flag=0;break; }
        findhead=findhead->next;
    }
    if(flag==1)cout<<"true";
    else  cout<<"false";
    return flag;
}
int main()
{
    int kd;
    cin>>kd;
    cin.ignore();
    if(kd==0){
        LinkList<int>A;
        int num;
        cin>>num;
        createlinklist(A);
       Judge_Symmetry( A, num);
    }
    else if(kd==1){
           LinkList<double>A;
        int num;
        cin>>num;
        createlinklist(A);
         Judge_Symmetry( A, num);
    }
    else if(kd==2){
            LinkList<char>A;
        int num;
        cin>>num;
        createlinklist(A);
      //  A.ListTraverse();
        Judge_Symmetry( A, num);
    }
     else if(kd==3){
            LinkList<string>A;
        int num;
        cin>>num;
        createlinklist(A);
       Judge_Symmetry( A, num);
    }
    else
        cout<<"err"<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值