题目:
算法设计题(要求将代码复制上来,并将运行结果截图上传到程序下面)
1、设计一个算法,顺序读取数组A[n]中的元素的数据值,建立一个带有头结点的单链表,使单链表中各元素的次序与A[n]中各元素的次序相同。
2、设有带头结点的单链表list,设计一个算法,判断它是否中心对称(即回文)
#include<iostream>
using namespace std;
#define OK 1
#define ERROR 0
#define Status bool
typedef struct LNode
{
int data;
LNode *next;
}LNode,*LinkList;
初始化
//Status InitList(LinkList &L)
//{
// L = new LNode;
// L->next = NULL;
// return OK;
//}
//创建
void CreateList(int n,LinkList &L,int A[])
{
L=new LNode; //新建一个结点
L->next=NULL;
LinkList r=L;
for(int i=0;i<n;i++)
{
LNode *p=new LNode;
p->data = A[i];
p->next=NULL;
r->next=p;
r=p;
}
}
void Print(LinkList L)
{
LinkList p=L;
while(p->next!=NULL)
{
cout<<p->next->data; //需要跳过头结点
p=p->next;
cout<<"->";
}
cout<<"NULL"<<endl;
}
// 判断数组是否相等
Status IFequal(int AAA[],int n)
{
for(int i=0;i<n/2;i++)
{
if(AAA[i]==AAA[n-i-1])
;
else
return ERROR;
}
return OK;
}
// 判断是否回文
void IFHUIWEN(LinkList L,int n)
{
int AAA[n];
LinkList p=L->next;
for(int i=0;i<n;i++)
{
AAA[i]=p->data;
p=p->next;
}
// for(int i=0;i<n;i++) //显示
// {
// cout<<"AAA["<<i<<"]="<<AAA[i]<<endl;
// }
//
if(IFequal(AAA,n)==ERROR)
cout<<"不是回文数"<<endl;
else if(IFequal(AAA,n)==OK)
cout<<"是回文数"<<endl;
}
int main()
{
int n=10;
int A[n]={1,2,3,4,5,6,7,8,9,10};
LinkList L;
CreateList(10,L,A);
Print(L);
IFHUIWEN(L,10);
cout<<"------------------------------------"<<endl;
int p=9;
int B[p]={1,2,3,4,5,4,3,2,1};
LinkList M;
CreateList(9,M,B);
Print(M);
IFHUIWEN(M,9);
return 0;
}
做题思路:
鉴于是单链表,没有办法直接前后双向比较。
一共有三种方法:
①复制到数组中进行比较,利用顺序表随机访问的优势
②利用快慢指针将链表一份为二,逆置后半部分链表并于前半部分进行比较
③最笨的办法,嵌套循环逐一比较
暂时想不出来更多了
运行结果