一道C语言的题目,真心没有头绪

通常称正读和反读都相同的字符序列为“回文”,例如‘abba’和‘abcdcba’是回文,‘abcde’和‘abab’则不是回文。若字符序列存储在一个单链表中,编写一个算法... 通常称正读和反读都相同的字符序列为“回文”,例如‘abba’和‘abcdcba’是回文,‘abcde’和‘abab’则不是回文。若字符序列存储在一个单链表中,编写一个算法判别此字符序列是否是“回文”。
要求:用C语言写出算法。
展开
 我来答
cbk808
2013-10-26 · TA获得超过383个赞
知道小有建树答主
回答量:479
采纳率:70%
帮助的人:285万
展开全部
#include<stdio.h>
#include<stdlib.h>
#define maxlen 20
typedef struct{
char ch[maxlen];
int last;
}Sequenlist;
typedef struct{
char data[maxlen];
int top;
}Seqstack;
Sequenlist *Sqlsetnull(){      //建空顺序表
Sequenlist *L;
L=(Sequenlist *)malloc(sizeof(Sequenlist));
L->last=-1;
return L;
}
Seqstack * Setstack(){       //建空栈
Seqstack *S;
S=(Seqstack *)malloc(sizeof(Seqstack));
S->top=-1;
return S;
}
Seqstack * Pushstack(char x,Seqstack *S){  //入栈
S->top++;
S->data[S->top]=x;
return S;
}
Seqstack * Popstack(Seqstack *S){    //出栈
S->top--;
return S;
}
char Gettop(Seqstack *S){     //取栈顶
return S->data[S->top];
}
Sequenlist *Pushlist(){   //将字符串存入顺序表中
Sequenlist *L;
L=Sqlsetnull();
char a;
printf("请输入字符串,并以'#'结束!\n");
a=getchar();
while(a!='#'){
L->last++;
L->ch[L->last]=a;
a=getchar();
}
return L;
}
int Compare(Sequenlist *L){     //判断是不是回文
int  i,n;
n=(L->last+1)/2;
Seqstack *S;
S=Setstack();
for(i=0;i<n;i++){
S=Pushstack(L->ch[L->last],S);
L->last--;
}
while(L->last!=S->top)
L->last--;
while(L->ch[L->last]==S->data[S->top]&&L->last!=-1){
L->last--;
S=Popstack(S);
}
if(L->last==-1)     //是回文返回1
return 1;
else                //不是回文返回0
return 0;
}
void Resultout(int a){    //结果输出
if(a==1)
printf("该字符串是回文!\n");
if(a==0)
printf("该字符串不是回文!\n");
}
void main(){
Resultout(Compare(Pushlist()));
}
veket的小号
2013-10-26 · TA获得超过3371个赞
知道大有可为答主
回答量:3762
采纳率:0%
帮助的人:3970万
展开全部
鉴于单链只能单向访问
新建另一个单链
用头插法,顺序拷贝源链的节点插入新链的头部
然后比较这样两个单链的前半段就OK了
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
帐号已注销
2013-10-26 · TA获得超过301个赞
知道小有建树答主
回答量:223
采纳率:0%
帮助的人:206万
展开全部
编码中.....
追问
谢啊~麻烦最好有注释
追答
#include <stdio.h>
#include <stdlib.h>

struct node{
char c;
node *next;
}; 
node *creat();  //创建链表
node *reverse(node *); //反转链表
void main()
{
char str1[100],str2[100];
int i=0,j=0;
node *head;
head = creat();
for(node* tmp=head;tmp;tmp=tmp->next) //遍历链表,将每个元素存在字符数组str1
str1[i++]=tmp->c;
head = reverse(head); //反转链表
for(node* tmp=head;tmp;tmp=tmp->next) //将反转后链表的每个元素存在字符数组str2中
str2[j++]=tmp->c;
for(j=0;j<i;j++){ //比较
if(str1[j]!=str2[j])
{
printf("该字符串不是回文.\n");
return ;
}
}
printf("该字符串是回文.\n");
}
node *creat()  
{
printf("请输入字符串(输入回车结束):");
char c;
c=getchar();
node *p1,*p2,*head;
head=NULL;
p1=(node *)malloc(sizeof(node));
p1->c=c;
head =p1;
p2=p1;
p1->next=NULL;
while(1)   
{
c=getchar();
if(c=='\n')
break;
p1=(node *)malloc(sizeof(node));
p1->c=c;
p2->next=p1;
p1->next=NULL;
p2=p1;
}
return head;
}

node *reverse(node *first)
{
node *p1,*p2,*p3;
p2=first;
p3=first->next;
do{
p1=p2;
p2=p3;
p3=p2->next;
p2->next=p1;
}
while(p3!=NULL);
first->next=NULL;
return p2;
}

满意请采纳!不懂可以问。

本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式