首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

c语言有关问题-分解单链表

2013-11-18 
c语言问题-分解单链表新手求助课堂作业已知由具有头结点的单链表表示的线性表中,含有三类字符的数据元素(

c语言问题-分解单链表
新手求助课堂作业
已知由具有头结点的单链表表示的线性表中,含有三类字符的数据元素(字母、数字和其他字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含有同一类的字符,且利用原表中的结点空间,头结点可另辟空间。

我写的代码如下:


#include<stdio.h>
#include<malloc.h>
typedef char datatype;
typedef struct node
{
    datatype data;
    struct node *next;
} linklist;
void create(linklist*&);
void resolve(linklist*,linklist*,linklist*,linklist*);
void insert(linklist*,linklist*);
void print1(linklist*);
void print2(linklist*);
int main()
{
    linklist *head,*letter,*digit,*other;
    create(head);
    print1(head);
    letter=(linklist*)malloc(sizeof(linklist));//建立3个空循环链表
    letter->next=letter;
    digit=(linklist*)malloc(sizeof(linklist));
    digit->next=digit;
    other=(linklist*)malloc(sizeof(linklist));
    other->next=other;
    resolve(head,letter,digit,other);//调用分解单链表的函数
    print2(letter);//输出循环链表
    print2(digit);
    print2(other);
}

//建立单链表
void create(linklist*&head)
{
    datatype x;
    linklist *s,*r;
    head=new linklist;
    r=head;
    while((x=getchar())!='\n')
    {
        s=(linklist*)malloc(sizeof(linklist));
        s->data=x;
        r->next=s;
        r=s;
    }
    r->next=NULL;
}

//在循环链表中插入
void insert(linklist*h,linklist*p)
{
    linklist *q=h;
    while(q->next!=h) q=q->next;
    q->next=p;
    p->next=h;
}

//输出单链表
void print1(linklist*head)
{
    linklist *p=head->next;
    while(p!=NULL)
    {
        printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}

//输出循环链表
void print2(linklist*head)
{
    linklist *p=head->next;
    while(p!=head)
    {
        printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}

//添加按字母、数字、其它字符分解单链表算法
void resolve(linklist*head,linklist*letter,linklist*digit,linklist*other)
{
    linklist *a,*temp;
    a=head->next;
    while(a!=NULL)
    {
        if(a->data>=65&&a->data<=90||a->data>=97&&a->data<=122)
        {
            temp=a;
            a=a->next;              //*这句话不能放到选择外面
            insert(letter,temp);
        }
        else if(a->data>=48&&a->data<=57)
        {
            temp=a;
            a=a->next;
            insert(digit,temp);
        }
        else
        {
            temp=a;
            a=a->next;
            insert(other,temp);
        }
        //a=a->next;
    }
}


Question:
最后一个resolve函数里面的'a=a->next'这句为什么不能放到选择外面?放到外面后进入Insert函数后就陷入了死循环,不断重复insert(other,temp)。 c语言问题
[解决办法]
引用:
新手求助课堂作业
已知由具有头结点的单链表表示的线性表中,含有三类字符的数据元素(字母、数字和其他字符),试编写算法构造三个以循环链表表示的线性表,使每个表中只含有同一类的字符,且利用原表中的结点空间,头结点可另辟空间。



我写的代码如下:


#include<stdio.h>
#include<malloc.h>
typedef char datatype;
typedef struct node
{
    datatype data;
    struct node *next;
} linklist;
void create(linklist*&);
void resolve(linklist*,linklist*,linklist*,linklist*);
void insert(linklist*,linklist*);
void print1(linklist*);
void print2(linklist*);
int main()
{
    linklist *head,*letter,*digit,*other;
    create(head);
    print1(head);
    letter=(linklist*)malloc(sizeof(linklist));//建立3个空循环链表
    letter->next=letter;
    digit=(linklist*)malloc(sizeof(linklist));
    digit->next=digit;
    other=(linklist*)malloc(sizeof(linklist));
    other->next=other;
    resolve(head,letter,digit,other);//调用分解单链表的函数
    print2(letter);//输出循环链表
    print2(digit);
    print2(other);
}

//建立单链表
void create(linklist*&head)
{
    datatype x;
    linklist *s,*r;
    head=new linklist;
    r=head;
    while((x=getchar())!='\n')
    {
        s=(linklist*)malloc(sizeof(linklist));
        s->data=x;
        r->next=s;
        r=s;
    }
    r->next=NULL;
}

//在循环链表中插入
void insert(linklist*h,linklist*p)
{
    linklist *q=h;
    while(q->next!=h) q=q->next;
    q->next=p;
    p->next=h;
}

//输出单链表
void print1(linklist*head)
{
    linklist *p=head->next;
    while(p!=NULL)
    {
        printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}

//输出循环链表
void print2(linklist*head)
{
    linklist *p=head->next;
    while(p!=head)
    {
        printf("%c",p->data);
        p=p->next;
    }
    printf("\n");
}

//添加按字母、数字、其它字符分解单链表算法
void resolve(linklist*head,linklist*letter,linklist*digit,linklist*other)
{
    linklist *a,*temp;
    a=head->next;
    while(a!=NULL)
    {
        if(a->data>=65&&a->data<=90
[解决办法]
a->data>=97&&a->data<=122)
        {
            temp=a;
            a=a->next;              //*这句话不能放到选择外面
            insert(letter,temp);
        }
        else if(a->data>=48&&a->data<=57)
        {
            temp=a;
            a=a->next;
            insert(digit,temp);
        }
        else
        {
            temp=a;
            a=a->next;
            insert(other,temp);
        }
        //a=a->next;
    }
}


Question:
最后一个resolve函数里面的'a=a->next'这句为什么不能放到选择外面?放到外面后进入Insert函数后就陷入了死循环,不断重复insert(other,temp)。

可以的
这样做

//添加按字母、数字、其它字符分解单链表算法
void resolve(linklist*head,linklist*letter,linklist*digit,linklist*other)
{
    linklist *a,*temp;
    a=head->next;
    linklist * insLst;
    while(a!=NULL)
    {
        if(a->data>=65&&a->data<=90
[解决办法]
a->data>=97&&a->data<=122)
        {    insLst = letter; }


        else if(a->data>=48&&a->data<=57)
        {    insLst =digit;  }
        else   { insLst = other;}
        temp = a;
        a = a->next;              //*这句话能放到选择外面
        insert( insLst,temp);    //因为这句话,所以你的做法,不能放到外面
    }
}


[解决办法]
也就是说a=a->next;语句必须在insert()函数之前,仔细分析insert()函数,
你传入的第二个参数p,在insert函数中修改了p的next指针,
在resolve函数中,如果a=a->next放在里面,也就是insert()函数前面,就会被你在insert()中修改,返回时就找不到原来的链表,所以会陷入死循环。

http://www.onestraw.net 

热点排行