注册 登录
编程论坛 数据结构与算法

将单循环链表该双循环链表,重写了程序,还是有问题请大家帮忙看看

世界模型 发布于 2011-03-16 13:33, 664 次点击

#include<stdio.h>
#include<stdlib.h>

typedef struct LNode
{
    int    data;
    struct LNode *p,*next;
} LNode, *LinkList;

/*建立循环单链表*/
LinkList createList_L(int n)
{
     LinkList L=NULL;
    LNode *s,*r=NULL;
    int i;
    printf("请输入元素的个数n:");
    scanf("%d",&n);

    for(i=1;i<=n;i++)
    {
        s=(LNode*)malloc(sizeof(LNode));
        //s->data=i;
        s->next=NULL;
        if(L==NULL)
        {
            r=L=s;
        }
        else
            r->next=s;
        r=s;
    }
        r->next=L;

    printf("输入这些结点的数据:",n);
    for(i=1;i<=n;i++)
    {
        scanf("%d",&s->data);
        s=s->next;
    }

    return L;
}
void LinkChange(LinkList L)
{
    LinkList q;
    for(q=L;!q->next->p;q=q->next)
        q->next->p=q;
}
void print_LinkList(LinkList L)
{
    LinkList p;
    p=L->next ;
    //for(;p!=NULL;p=L->next)
        printf("%d",p->data);
}
int main()
{
    LinkList L;
    int n;

    L=createList_L(n);
    print_LinkList(L);

    LinkChange( L);
    print_LinkList(L);
    return 0;
}
5 回复
#2
寒风中的细雨2011-03-16 15:53
程序代码:
//将单循环链表该双循环链表,重写了程序,还是有问题请大家帮忙看看
#include<stdio.h>
#include<stdlib.h>

typedef struct LNode
{
    int    data;
    struct LNode *p,*next;
} LNode, *LinkList;

/*建立循环单链表*/
LinkList createList_L()
{
    LinkList L=NULL;
    LNode *s,*r=NULL;
    int i, n;
    printf("请输入元素的个数n:");
    scanf("%d",&n);

    for(i=1;i<=n;i++)
    {
        s=(LNode*)malloc(sizeof(LNode));
        //s->data=i;
        s->next=NULL;
        if(L==NULL)
        {
            r=L=s;
        }
        else
        {
            r->next=s;
            r=s;
        }
    }
    r->next=L;

    s = L;
    printf("输入这些结点的数据:\n");
/*    for(i=1;i<=n;i++)
    {
        scanf("%d",&s->data);
        s=s->next;
    }
*/
    do
    {
        scanf("%d", &s->data );
        s = s->next;
    }while( L != s );


    return L;
}

LinkList LinkChange(LinkList L)
{
    LinkList pre, next;
    pre = L;
    do
    {
        next = pre->next;
        next->p = pre;
        pre = pre->next;
    }while( pre != L );

    return L;

 /*   for(q=L;!q->next->p;q=q->next)
    {
        q->next->p = q;
    }
*/
}

void print_LinkList(LinkList L)
{
    LinkList p;
    p = L;
    do
    {
        printf("%d ",p->data);
        p = p->next;
    }while( p != L );

    printf("\n");
}

void r_print( LinkList L )
{
    LinkList p;
    p = L;
    do
    {
        printf("%d", p->data);
        p = p->p;
    }while( p != L );
    printf("\n");

}

int main()
{
    LinkList L;
    //int n;

    L=createList_L();
    print_LinkList(L);

    L = LinkChange( L);
    r_print(L);
    return 0;
}
#3
寒风中的细雨2011-03-16 15:57
在做循环链表(单、双)的时候   用到循环的时候 最好的做法是使用do{}while();格式
这样判断的容易写些  不用设置计数器等类的标志

上面的代码虽然可以跑但是 在进行测试的时候 还是把判断边界的情况加进去
#4
寒风中的细雨2011-03-16 16:00
程序代码:
void LinkChange(LinkList L)
{
    LinkList q;
    for(q=L;!q->next->p;q=q->next)
        q->next->p=q;
}
像这样的代码:试图改变链表的 不是引用(LinkList &L)格式  不带返回值的(除掉全局的) 可以考虑是不对的
#5
世界模型2011-03-16 20:07
谢谢,
#6
帅的让人抽2011-03-20 10:55
顶一下……
1