| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4107 人关注过本帖
标题:判断单链表是否对称的问题
只看楼主 加入收藏
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
结帖率:66.67%
收藏
 问题点数:0 回复次数:37 
判断单链表是否对称的问题
自己解决问题的思路是采用泛型算法,分别从头和尾开始逐个判断元素是否相等,如果发现不相等中断循环并返回标志位flag=0;否则返回flag=1,具体程序如下所示,现在的问题是连返回链表最后一个元素的值都出现了问题(在last函数中返回最后一个元素的指针),程序运行到q=last(phead);printf("链表的最后一个元素为:%d",q->data);的时候出现了问题,求解惑,顺便在问一下,这种算法能否实现对单链表对称的判断。谢谢。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
typedef struct Node
{
    int data;
    struct Node * pnext;
}NODE, * PNODE;
PNODE create_list()
{
    PNODE phead=(PNODE)malloc(sizeof(NODE));
    if(phead==NULL)
    {
        printf("内存分配失败,程序终止。\n");
        exit(-1);
    }
    int val,len,i;
    printf("请输入您要建立的链表的长度:len=");
    scanf("%d",&len);
    PNODE ptail;
    ptail=phead;
    for(i=0;i<len;i++)
    {
        PNODE pnew=(PNODE)malloc(sizeof(NODE));
        if(pnew==NULL)
        {
            printf("内存分配失败,程序终止。\n");
            exit(-1);
        }
        printf("\n请输入第%d个节点的值:",i+1);
        scanf("%d",&val);
        pnew->data =val;
        ptail->pnext =pnew;
        pnew->pnext =NULL;
        ptail=pnew;
    }
    return phead;
}
void traverse_list(PNODE phead)
{
    PNODE p=phead->pnext ;
    while(p!= NULL)
    {
        printf("%d ",p->data);
        p=p->pnext;
    }
    printf("\n");
}
int length(PNODE phead)
{
    PNODE p=phead->pnext;
    int n=0;
    while(NULL!=p)
    {
        n++;
        p=p->pnext;
    }
    return n;
}
PNODE last(PNODE phead)
{
    PNODE p=phead;
    while(p!=NULL)
    {
        p=p->pnext;
    }
    return p;
}
/*int symmetry(PNODE phead,int n)
{
    PNODE p,q;
    int flag=1,i;
    p=phead->pnext;
    for(i=0;i<n/2;i++)
    {
        q=last(phead);
        if(p->data!=q->data)
        {
            flag=0;break;
        }
        p=p->pnext;
        free(q);
        q=NULL;
    }
    return flag;
}*/
bool is_empty(PNODE phead)
{
    PNODE p=phead->pnext;
    if(p==NULL)
        return true;
    else
        return false;
}
int main(void)
{
    PNODE phead,q;
    int len,flag;
    phead=create_list();
    if(is_empty(phead))
        printf("\n链表为空。\n");
    else
        printf("\n链表不空。\n");
    len=length(phead);
    printf("\n链表的长度是%d\n",len);
    printf("\n链表输出如下:\n");
    traverse_list(phead);    q=last(phead);
    printf("链表的最后一个元素为:%d",q->data);
    /*flag=symmetry(phead,length(phead));
    if(flag)
    {
        printf("链表是对称的\n");
    }
    else
        printf("链表是非对称的\n");*/
    q=last(phead);
    printf("链表的最后一个元素为:%d",q->data);
    traverse_list(phead);
    return 0;
}
搜索更多相关主题的帖子: 元素 include 
2013-09-13 22:05
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
这个返回值只能是空指针
PNODE last(PNODE phead)
{
PNODE p=phead;
while(p!=NULL)
{
p=p->pnext;
}
return p;
}

总有那身价贱的人给作业贴回复完整的代码
2013-09-13 22:19
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
连分都没有?

总有那身价贱的人给作业贴回复完整的代码
2013-09-13 22:19
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
楼上说的是,改进一下,增设一个指针变量以返回链表最后一个节点的值,程序如下:
PNODE last(PNODE phead)
{
    PNODE p=phead->pnext,q;
    while(p!=NULL)
    {
        q=p;
        p=p->pnext;
    }
    return q;
}
但是symmetry函数还是实现不了判断对称的功能,求解,谢谢。
2013-09-14 09:48
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
求关注啊!
2013-09-16 10:52
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
毛病在symmetry函数这两句:
free(q);
q=NULL;
你本意是想把链表尾结点去掉,实际上能去掉吗?自己画图看看

总有那身价贱的人给作业贴回复完整的代码
2013-09-16 15:30
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
修改了一下,当n<4是是可以检验的,但是当n>3时又运行不了,求解。
int symmetry(PNODE phead,int n)
{
    PNODE p,q;
    PNODE r=(PNODE)malloc(sizeof(NODE));
        if(r==NULL)
    {
        printf("内存分配失败,程序终止。\n");
        exit(-1);
    }
    int flag=1,i;
    p=phead->pnext;
    for(i=0;i<n/2;i++)
    {
        q=last(phead);
        if(p->data!=q->data)
        {
            flag=0;break;
        }
        p=p->pnext;
        r=q;
        q=NULL;
        free(r);
    }
    return flag;
}
2013-09-16 22:39
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 7楼 xiedj
乱写,你拿笔在纸上画一画,怎么才是删除链表最后一个节点。

[ 本帖最后由 embed_xuel 于 2013-9-16 23:00 编辑 ]

总有那身价贱的人给作业贴回复完整的代码
2013-09-16 22:53
xiedj
Rank: 1
等 级:新手上路
帖 子:62
专家分:0
注 册:2013-5-30
收藏
得分:0 
我画图分析过,我先说下我的看法:首先q指针指向最后一个节点,也就是尾节点,然后free(q),即先把q所指的节点内存释放,即尾节点内存释放,之后再q=NULL;即尾节点的前一个节点的指针域置为空。整个过程不知是哪一步出了问题,求解释。
2013-09-17 10:55
embed_xuel
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:58
帖 子:3845
专家分:11385
注 册:2011-9-13
收藏
得分:0 
回复 9楼 xiedj
什么是链表?为什么要用链这个字眼!

总有那身价贱的人给作业贴回复完整的代码
2013-09-17 13:31
快速回复:判断单链表是否对称的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016410 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved