| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1509 人关注过本帖
标题:一个线性链表分割成为三个循坏链表 问题
只看楼主 加入收藏
hcanhong
Rank: 1
来 自:肇庆学院网络工程系
等 级:新手上路
帖 子:58
专家分:0
注 册:2008-9-6
收藏
 问题点数:0 回复次数:3 
一个线性链表分割成为三个循坏链表 问题
原题目:已知由一个线性链表表示中含有三类字符的数据元素(如:字母字符、数字字符和其他字符),试编写程序将该线性链表分割成为三个循坏链表,其中每个循坏链表表示的线性表中均只含一类字符。

小弟莱鸟我的程序是这样的:
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

typedef struct LNode {
    char data;
    struct LNode *next;
}LNode, *LinkList;//定义单链表

typedef struct cnode {
    char data;
    struct LNode *next;
}cnode, *CiList;//定义循坏链表

LinkList creat(LinkList head)
{
    LinkList l, q, p;//用指针类型定义三个节点类型的指针
    int ch;

    l = (LinkList)malloc(sizeof(LNode));//分配内存空间           
    l->data = 0;  //为头结点的数据域赋值,值为0                        
    l->next = NULL; //指明下一个结点目前不存在                 

    q = l;   //q为游动指针,链表结点的连结要用

    printf("Input the Incremental s:\n");
    scanf("%c",&ch);   

    while (ch != 0)      //输入0,表示输入结束                        
    {
        p = (LinkList)malloc(sizeof(LNode));  //为新输入的数据分配内存空间           
        p->data = ch;
        p->next = NULL;                    //新输入的节点在链表的最后,即它的后面没有其他元素
        q->next = p;                    //q用于将上一个元素链接至当前新元素
        q = p;                       //q自己移到当前最后一个元素,以备继续链接所用
        scanf("%c",&ch);
    }

    q = l;//输入整个链表前,先将q移到链表头,l一般不动

    return q;
}   

void LinkList_Divide(LinkList L,CiList A,CiList B,CiList C)
//将线性链L表分割成为三个循坏链表A、B、C
{

    CiList l;
    CiList p, q, r;
    char s;

    A = (CiList)malloc(sizeof(cnode));
    p = A;
    B = (CiList)malloc(sizeof(cnode));
    q = B;
    C = (CiList)malloc(sizeof(cnode));
    r = C; //建立头结点

    while ( L )
    {
        s = L->data;

        l = (CiList)malloc(sizeof(cnode));
            if ( !l )//检查内存指针
                exit(0);
            l->data = s;//创建结点内容
            l->next = NULL; //设置指针初值

        if ( isalpha (l->data) )//如果测试l->data为数字字符时
        {
            l->next = p->next;//新结点指向下一个结点
            p->next = l;//前一结点指向新结点
            free(l);//释放l结点内容,以便下一次用
        //    p = A;
        }
        else if ( isdigit (l->data) )//如果测试l->data为字母字符时
        {
            l->next = q->next;//新结点指向下一个结点
            q->next = l;//前一结点指向新结点
            free(l);//释放l结点内容,以便下一次用
        //    q = B;
        }
        else//如果测试l->data为其他字符时
        {
            l->next = r->next;//新结点指向下一个结点
            r->next = l;//前一结点指向新结点
            free(l);//释放l结点内容,以便下一次用
        //    r = C;
        }

        L = L->next;//指示下一个内容
    }

    p->next = A;
    q->next = B;
    r->next = C; //完成循环链表
    
}

void PrintCList ( CiList head )
//打印循坏链表
{
    CiList ptr;
   
    ptr = head;
    
    do
    {
        printf("%c",ptr->data);
        ptr = ptr->next;
    } while ( head != ptr && head != head->next);

    printf("\n");

}


void main()
{
    LinkList L = NULL;
    CiList A = NULL, B = NULL, C = NULL;

    creat ( L );

    LinkList_Divide(L, A, B, C);

    PrintCList ( A );
    PrintCList ( B );
    PrintCList ( C );
}

可我的程序总是被编译器提示出现这样的错误:
cannot convert from 'struct cnode *' to 'struct LNode *'
为什么会这样呢?~~我上网找了很多,但都不能找到,在这向各位请教~
为什么会这样?怎样修改?
搜索更多相关主题的帖子: 链表 线性 
2008-10-08 16:34
很远的那颗星
Rank: 2
等 级:新手上路
威 望:4
帖 子:544
专家分:0
注 册:2008-6-30
收藏
得分:0 
typedef struct LNode {
    char data;
    struct LNode *next;
}LNode, *LinkList;//定义单链表

typedef struct cnode {
    char data;
    struct LNode *next;
}cnode, *CiList;//定义循坏链表

你定义了两个结构体,然后在它们之间相互赋值,肯定错啦...

Fighting~~~~~~~~
2008-10-08 17:10
hcanhong
Rank: 1
来 自:肇庆学院网络工程系
等 级:新手上路
帖 子:58
专家分:0
注 册:2008-9-6
收藏
得分:0 
回复 2# 很远的那颗星 的帖子
不这样做,那要怎样才能一个线性链表分割成为三个循坏链表??
2008-10-08 17:30
很远的那颗星
Rank: 2
等 级:新手上路
威 望:4
帖 子:544
专家分:0
注 册:2008-6-30
收藏
得分:0 
就定义一个结构体就行了啊...把那些结点连成循环链表就可以了吧..
一个单链表,你可以一个一个的读入它的结点.把你想要它变成循环表的结点连成循环表不就行了...

Fighting~~~~~~~~
2008-10-08 18:00
快速回复:一个线性链表分割成为三个循坏链表 问题
数据加载中...
 
   



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

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