免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 4218 | 回复: 26
打印 上一主题 下一主题

数据结构学的不好,想请教一下各位,帮帮忙哈~~ [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-09 17:43 |只看该作者 |倒序浏览
现在在做一道题,要用随机数器构造两个链表,然后把它们连接起来,并且纯化(及删除相同的元素),需要怎么思考?

我现在把它分解成了许多步骤,建表,连接,纯化,然后一个一个实现,每个写了一段代码,比如说

/*创建一个带头结点的空链表*/
LinkList createNullList_link(void){
        LinkList llist1=(Linklist)malloc(sizeof(struct Node));/*申请表头结点空间*/
        PNode p;
        if(llist1!=NULL)  {
                llist1->link=NULL;   
                p=llist1;
                printf("The first linklist is:");}
        else printf("Out of space!\n");/*创建失败*/
        return llist1;
}

还有连接
int add_list(LinkList llist1,LinkList llist2)
{
        q->link=s;
}

等等。

可是现在不知道要怎么才能将它们实现,是应该用函数么?不太会,希望能有人帮帮我。

论坛徽章:
0
2 [报告]
发表于 2012-03-09 17:58 |只看该作者
http://bbs.chinaunix.net/thread-3680886-1-1.html
参考这个C单链吧,不过,他的createList 有一点点问题,你要自己改一下。

论坛徽章:
0
3 [报告]
发表于 2012-03-09 18:00 |只看该作者
先把链表的基本步骤写好:建表,插入,删除,遍历...弄好了,你就明白了...

论坛徽章:
0
4 [报告]
发表于 2012-03-09 18:17 |只看该作者
恩,我也是这样一点一点想的,把每一步都分解开,但是就是连接不起来的感觉,有关函数学的不好。
代码在下面,能麻烦帮我看看么?太长了,细节您就不用看了我自己去找错,就是麻烦能不能帮我看看这里大体上的结构啊函数的用法上的错误。实在是摸不到头脑了…呵呵,先谢谢了~~


/* LinkList.cpp*/  
/*线性表的单链表示:函数实现*/

#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
#include<time.h>

/*创建一个带头结点的空链表*/
LinkList CreateNullList_link(void){
        LinkList llist1=(Linklist)malloc(sizeof(struct Node));/*申请表头结点空间*/
        PNode p;
        if(llist1!=NULL)  {
                llist1->link=NULL;   
                p=llist1;
                printf("The first linklist is:";}
        else printf("Out of space!\n";/*创建失败*/
        return llist1;
}

/*利用随机数器构造单链表llist1*/
int Create_list(LinkList llist1){
int n1,i;
srand((int)time(NULL))
        n1=rand()%100+1;
for(i=1;i<=n1;i++)
{
        x=rand()%100;
        PNode q = (PNode)malloc( sizeof( struct Node ) );        /* 申请新结点 */
    if( q == NULL ) {printf( "Out of space!!!\n" );  }
    else {        q->info = x;  q->link = p->link;  p->link = q; printf("%d ",q);        }
}
printf("\n";
}

/*创建一个带头结点的空链表*/
LinkList CreateNullList_link(void){
        LinkList llist2=(Linklist)malloc(sizeof(struct Node));/*申请表头结点空间*/
        PNode s;
        if(llist2!=NULL)  {
                llist2->link=NULL;   
                s=llist2;
                printf("The second linklist is:";}
        else printf("Out of space!\n";/*创建失败*/
        return llist2;
}

/*利用随机数器构造单链表llist2*/
int create_list(LinkList llist2){
int n2,i;
srand((int)time(NULL))
        n2=rand()%100+1;
for(i=1;i<=n2;i++)
{
        x=rand()%100;
        PNode t = (PNode)malloc( sizeof( struct Node ) );        /* 申请新结点 */
    if( t == NULL ) {printf( "Out of space!!!\n" );  }
    else {        t->info = x;  t->link = s->link;  s->link = t; printf("%d ",t);        }
}
printf("\n";
}

/*将两链表归并成一个链表*/
int add_list(LinkList llist1,LinkList llist2)
{
        q->link=s;
}


/*链表的纯化*/
int delete_link(Linklist llist1,DataType x)
{
        PNode h,r;
        if(p==NULL)  return(0);
        p=p->link;
        while(p->link!=NULL)
        {
                x=p->info;
            h=p->link;
                while(h->link!=NULL)
                {
                        if(h->link->info!=x)
                        {
                            h=h->link;
                        }
                        else
                        {
                                r=h->link;
                                h->link=r->link;
                                free(r);
                        }
                }
                if(h->link-NULL)
                {
                        p=p->link;
                }
        }
}


/*输出显示归并纯化后的链表*/
int Outlist_link(Linklist llist1)
{
        while(p->link!=NULL)
        {
                printf("%d ",p->link->info;
                p=p->link;
        }
        printf("%d ",p->link->info
}

/*查找最大、最小元素*/
int chazhao_link(Linklist llist1)
{
        DataType min,max;
        min=p->link->info;
        max=p->link->info;
        while(p->link!=NULL)
        {
                p=p->link;
                if(p->link->info<min)
                {
                        min=p->link->info;
                }
                if(p-link->info>max)
                {
                        max=p->link->info;
                }
        }
        printf("The max number is:%d\n",max);
        printf("The min number is:%d\n",min);
}



int main()
{
        Linklist llist1,llist2;
        CreateNullList_link(llist1);
        Create_list(llist1);
             CreateNullList_link(llist2)
             Create_list(llist2);
        add_list(llist1,llist2);
        delete_link(llist1);
        Outlist_link(llist1);
        chazhao_link(llist1);
        return 0;
}




   

论坛徽章:
0
5 [报告]
发表于 2012-03-09 18:18 |只看该作者
呵呵,看不太懂啊,我就是搞不清楚这些函数怎么个用法……回复 2# fanasy


   

论坛徽章:
0
6 [报告]
发表于 2012-03-09 18:19 |只看该作者
恩,我也是这样一点一点想的,把每一步都分解开,但是就是连接不起来的感觉,有关函数学的不好。
代码在下面,能麻烦帮我看看么?太长了,细节您就不用看了我自己去找错,就是麻烦能不能帮我看看这里大体上的结构啊函数的用法上的错误。实在是摸不到头脑了…呵呵,先谢谢了~~


/* LinkList.cpp*/  
/*线性表的单链表示:函数实现*/

#include <stdio.h>
#include <stdlib.h>
#include "LinkList.h"
#include<time.h>

/*创建一个带头结点的空链表*/
LinkList CreateNullList_link(void){
        LinkList llist1=(Linklist)malloc(sizeof(struct Node));/*申请表头结点空间*/
        PNode p;
        if(llist1!=NULL)  {
                llist1->link=NULL;   
                p=llist1;
                printf("The first linklist is:";}
        else printf("Out of space!\n";/*创建失败*/
        return llist1;
}

/*利用随机数器构造单链表llist1*/
int Create_list(LinkList llist1){
int n1,i;
srand((int)time(NULL))
        n1=rand()%100+1;
for(i=1;i<=n1;i++)
{
        x=rand()%100;
        PNode q = (PNode)malloc( sizeof( struct Node ) );        /* 申请新结点 */
    if( q == NULL ) {printf( "Out of space!!!\n" );  }
    else {        q->info = x;  q->link = p->link;  p->link = q; printf("%d ",q);        }
}
printf("\n";
}

/*创建一个带头结点的空链表*/
LinkList CreateNullList_link(void){
        LinkList llist2=(Linklist)malloc(sizeof(struct Node));/*申请表头结点空间*/
        PNode s;
        if(llist2!=NULL)  {
                llist2->link=NULL;   
                s=llist2;
                printf("The second linklist is:";}
        else printf("Out of space!\n";/*创建失败*/
        return llist2;
}

/*利用随机数器构造单链表llist2*/
int create_list(LinkList llist2){
int n2,i;
srand((int)time(NULL))
        n2=rand()%100+1;
for(i=1;i<=n2;i++)
{
        x=rand()%100;
        PNode t = (PNode)malloc( sizeof( struct Node ) );        /* 申请新结点 */
    if( t == NULL ) {printf( "Out of space!!!\n" );  }
    else {        t->info = x;  t->link = s->link;  s->link = t; printf("%d ",t);        }
}
printf("\n";
}

/*将两链表归并成一个链表*/
int add_list(LinkList llist1,LinkList llist2)
{
        q->link=s;
}


/*链表的纯化*/
int delete_link(Linklist llist1,DataType x)
{
        PNode h,r;
        if(p==NULL)  return(0);
        p=p->link;
        while(p->link!=NULL)
        {
                x=p->info;
            h=p->link;
                while(h->link!=NULL)
                {
                        if(h->link->info!=x)
                        {
                            h=h->link;
                        }
                        else
                        {
                                r=h->link;
                                h->link=r->link;
                                free(r);
                        }
                }
                if(h->link-NULL)
                {
                        p=p->link;
                }
        }
}


/*输出显示归并纯化后的链表*/
int Outlist_link(Linklist llist1)
{
        while(p->link!=NULL)
        {
                printf("%d ",p->link->info;
                p=p->link;
        }
        printf("%d ",p->link->info
}

/*查找最大、最小元素*/
int chazhao_link(Linklist llist1)
{
        DataType min,max;
        min=p->link->info;
        max=p->link->info;
        while(p->link!=NULL)
        {
                p=p->link;
                if(p->link->info<min)
                {
                        min=p->link->info;
                }
                if(p-link->info>max)
                {
                        max=p->link->info;
                }
        }
        printf("The max number is:%d\n",max);
        printf("The min number is:%d\n",min);
}



int main()
{
        Linklist llist1,llist2;
        CreateNullList_link(llist1);
        Create_list(llist1);
             CreateNullList_link(llist2)
             Create_list(llist2);
        add_list(llist1,llist2);
        delete_link(llist1);
        Outlist_link(llist1);
        chazhao_link(llist1);
        return 0;
}

回复 3# lsupper


   

论坛徽章:
0
7 [报告]
发表于 2012-03-09 18:29 |只看该作者
list 和数组的意思差不多,就是利用了结构体和指向下一个元素的指针。
Linklist list1,list2;
create(list1);
create(list2);
addlist(list1,list2);///addlist 中调用delete

论坛徽章:
0
8 [报告]
发表于 2012-03-09 18:53 |只看该作者
恩,这些有关链表啊的基本概念我也知道,就是有时候不知道怎么下手了,好像停留在门外进不去一样,很纠结…那像我上面贴上去的代码,那些调用应该怎么写啊?回复 7# fanasy


   

论坛徽章:
0
9 [报告]
发表于 2012-03-09 20:32 |只看该作者
呵呵,自己顶下,在线求解答啊…虽然不好意思的是问题有点弱…但是我是真的很困惑…求帮忙啊~~

论坛徽章:
0
10 [报告]
发表于 2012-03-09 21:38 |只看该作者
回复 8# wingwill
没明白什么样的叫基本调用?


   
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP