| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4543 人关注过本帖, 2 人收藏
标题:创建动态链表问题
只看楼主 加入收藏
zwb1986718
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2009-9-14
结帖率:100%
收藏(2)
已结贴  问题点数:20 回复次数:9 
创建动态链表问题
#include <stdio.h>
#include <malloc.h>
#define NUll 0
struct Node{
    int num;
    struct Node *next;
};

//创建链表函数,n为节点的个数
struct Node *Create1(int n){
    struct Node *head,*p1,*p2;
    int a ;
    head = NULL;
    //0个节点的情况
    if(n<=0) return head;
    //1个节点的情况
    if(n==1){
        p1 = (struct Node *)malloc(sizeof(struct Node));
        printf("请输入一个数字\n");
        scanf("%d",&a);
        head = p1;
        free(p1);
        return head;
    }
    //2个以上节点的情况
    if(n>=2){
        int flag = n-1;
        p1 = (struct Node *)malloc(sizeof(struct Node));
        printf("请输入一个数字\n");
        scanf("%d",&a);
        head = p2 = p1 ;
        
        while(flag){
            p1 = (struct Node *)malloc(sizeof(struct Node));
            printf("请输入一个数字\n");
            scanf("%d",&a);
            p2->next = p1;
            p2 = p1;
            --flag;
        }
        free(p1);
        return head;
    }
   
};


main(){
    struct Node *result = Create1(5);
   
    printf("%d\n",result->num);

}


函数的目的是根据输入的形参,创建n个节点(不包括头结点在内)

  创建过程很顺利,但是最后测试的时候,我输入的是1,2,3,4,5,但是最后输出的结果是一个很大的数字

  哪位牛人帮我看看这个程序呀,谢谢了哈!
--------------------------------------------

我把结构体也贴上来了,我大概知道是地址

  我已经调了好久了,总是按照之前自己的思路调,总觉得没错!

[ 本帖最后由 zwb1986718 于 2009-10-20 21:26 编辑 ]
搜索更多相关主题的帖子: 动态 链表 
2009-10-20 21:02
zwb1986718
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2009-9-14
收藏
得分:0 
忘记说了
  环境是vc++6.0;我已经调了好久了,怎么都调不出来
2009-10-20 21:10
lrongh
Rank: 2
等 级:论坛游民
帖 子:39
专家分:24
注 册:2009-10-6
收藏
得分:0 
代码不完全吧?没看到哪里定义过num,指针操作输出结果如为很大的数一般指的是地址,建议从这方面着重看一下。
2009-10-20 21:21
玩出来的代码
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:河南新乡
等 级:贵宾
威 望:11
帖 子:742
专家分:2989
注 册:2009-10-12
收藏
得分:5 
创建动态链表问题
 
#include <stdio.h>
#include <malloc.h>
#define NUll 0
struct Node{
    int num;
    struct Node *next;
};
 
//创建链表函数,n为节点的个数
struct Node *Create1(int n){
    struct Node *head,*p1,*p2;
    int a ;
    head = NULL;
    //0个节点的情况
    if(n<=0) return head;
    //1个节点的情况
    if(n==1){
        p1 = (struct Node *)malloc(sizeof(struct Node));
        printf("请输入一个数字\n");
        scanf("%d",&a);                    //这里的a的值没有赋给哪个指针的结点
        head = p1;
        free(p1);
        return head;
    }
    //2个以上节点的情况
    if(n>=2){
        int flag = n-1;
        p1 = (struct Node *)malloc(sizeof(struct Node));
        printf("请输入一个数字\n");
        scanf("%d",&a);                         //相同的问题。。
        head = p2 = p1 ;
         
        while(flag){
            p1 = (struct Node *)malloc(sizeof(struct Node));
            printf("请输入一个数字\n");
            scanf("%d",&a);                //这里的a的值也没有赋给哪个指针的结点

            p2->next = p1;
            p2 = p1;
            --flag;
        }
        free(p1);
        return head;
    }
     
};
 
 
main(){
    struct Node *result = Create1(5);
     
    printf("%d\n",result->num); //这里输出错误。。
 
}
你写的这个程序太乱,,建议你再重写个,可以对照参考资料看看。。

离恨恰如春草,更行更远还生。
2009-10-20 21:55
zwb1986718
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2009-9-14
收藏
得分:0 
回复 4楼 玩出来的代码
恩,谢谢你的建议

  前面的错误我改过来了,问下,最后一个错误怎么改?

   为什么说是我的输出错误?
2009-10-20 22:05
thesexhunter
Rank: 1
等 级:新手上路
帖 子:4
专家分:9
注 册:2009-10-20
收藏
得分:5 
#include <stdio.h>

#include <malloc.h>

//#define NUll 0 ---l小写,程序中的l大写

//#define NULL 0
struct Node
{

    int num;

    struct Node *next;

};



struct Node *Create1(int n){

    struct Node *head,*p1,*p2;

    //int a ;

    head = NULL;

    //0个节点的情况

    if(n<=0);//0个结点返回空


    else if(n==1)   //1个节点的情况
       {

          p1 = (struct Node *)malloc(sizeof(struct Node));

          printf("请输入一个数字:");

          //scanf("%d",&a);

          scanf ("%d",&p1->num);
          head = p1;

          //补充:既然仅仅是一个结点,那么应该在这一个节点的指针域中加入NULL,表示空
          p1->next=NULL;
          //free(p1); 在这里释放p1指向的结点有什么意义?创建了再释放,那么在main中肯定是没有结果的,Create1函数的作用不是create,而是create--free!

       }


    else if(n>=2)   //2个以上节点的情况
       {

           int flag = n-1;

           p1 = (struct Node *)malloc(sizeof(struct Node));

           printf("请输入一个数字:");

           //scanf("%d",&a);
           scanf ("%d",&p1->num);      //输入的这个数应该放到结构体中,放在a中有什么意义?

           head = p2 = p1 ;

        

           while(flag)
             {

               p1 = (struct Node *)malloc(sizeof(struct Node));

               printf("请输入一个数字:");

               //scanf("%d",&a);

               scanf (" %d",&p1->num);  //输入的这个数应该放到结构体中,放在a中有什么意义?
               p2->next = p1;

               p2 = p1;

               --flag;

             }

           //free(p1);

       }
     return head;

}//;  error1:这是一个函数,这里不需要分号


int main()
{
    int x;
    printf ("请输入要创建的结点个数x=");scanf ("%d",&x);

    struct Node *result=Create1(x);

    //printf("%d\n",result->num);  如果n>=2,是要用循环输出各结点的num,仅仅一个printf语句是不行的

    do
     {
        printf ("%d\n",result->num);
        result=result->next;
     }while (result!=NULL);
    return 0;   

}
//在没有改变之前,编译时提示的警告:-->53: 警告: 在有返回值的函数中,程序流程到达函数尾
//因为Create1函数确实是有多个return,3个单独的if语句就有3个return,应该把3个if语句用if()...else 语句替换,最后只有一个return,这样的话没有警告,但是输出还是错误的

/*

函数的目的是根据输入的形参,创建n个节点(不包括头结点在内)

创建过程很顺利,但是最后测试的时候,我输入的是1,2,3,4,5,但是最后输出的结果是一个很大的数字


-----------------------------------------------------------------------------------------------------

1) 输入的1,2,3,4,5,输出一个很大的数字,这个数字一定是一个随即数,因为你把create创建的结点在create函数本身释放掉了

2) 程序中定义的a是没有用的,scanf("%d",&a);并没有把a的值放到结构体中,那么,输出的时候当然不会输出结构体num中的值了
*/
2009-10-21 12:23
mfh
Rank: 6Rank: 6
等 级:侠之大者
帖 子:179
专家分:411
注 册:2009-5-31
收藏
得分:5 
#include <stdio.h>  
#include <malloc.h>  
#include <stdlib.h>
#define NUll 0  
struct Node
{  
    int num;  
    struct Node *next;  
};  
 
 
struct Node *Create1(struct Node *Head,int n)//创建链表函数,n为节点的个数  
{  
    struct Node *p=NULL;  
    struct Node *temp=NULL;
    int i;
     
    for(i=0;i<n;i++)
    {
        if((temp=(struct Node*)malloc(sizeof(struct Node)))==NULL)
        {
            printf("Malloc tmep error!!!\n");
            exit(0);
        }
        printf("请输入第%d个元素值:",i+1);
        scanf("%d",&temp->num);
        fflush(stdin);
        temp->next=NULL;
     
        if(Head==NULL)
        {
            if((Head=(struct Node*)malloc(sizeof(struct Node)))==NULL)
            {
                printf("Malloc Head error!!!\n");
                exit(0);
            }
            Head->next=temp;
            p=Head->next;
        }
        else
        {
            p->next=temp;
            p=temp;
        }
    }
    return Head;
}
////////////////////////////////////////////////////////////
 
int main()
{  
    struct Node *Head=NULL,*temp;
    int n;
    int i=1;
 
    printf("请输入你想创建表节点的个数:");
    scanf("%d",&n);
    fflush(stdin);
    Head=Create1(Head,n);
    printf("\n*******************************************************\n");
    printf("输出元素如下:\n");
    temp=Head->next;
    for(;temp!=NULL;temp=temp->next)
        printf("第%d个元素:%d\n",i++,temp->num);  
     
    return 0;
 
}
图片附件: 游客没有浏览图片的权限,请 登录注册


[ 本帖最后由 mfh 于 2009-10-21 22:50 编辑 ]
2009-10-21 22:49
mylzy159
Rank: 2
等 级:论坛游民
帖 子:61
专家分:23
注 册:2009-4-12
收藏
得分:5 
#include <stdio.h>
#include <malloc.h>
#define NUll 0
struct Node{
    int num;
    struct Node *next;
};
struct Node *Create1(int n){
    struct Node *head,*p1,*p2;
    int a ;
    head = NULL;
    if(n<=0) return head;
    if(n==1){
        p1 = (struct Node *)malloc(sizeof(struct Node));
        printf("请输入一个数字\n");
        scanf("%d",&a);
        p1->num=a;
        head = p1;
        p1->next=NULL;//
        return head;
    }
    if(n>=2){
        int flag = n-1;
        p1 = (struct Node *)malloc(sizeof(struct Node));
        printf("请输入一个数字\n");
        scanf("%d",&a);
        p1->num=a;//你没有输入数据进入节点-_-应该忘记了吧..
        head=p1 ;
        p2=head;//这里应该是p2指向头指针.因为p2只是过度的.
        while(flag){
            p1 = (struct Node *)malloc(sizeof(struct Node));
            printf("请输入一个数字\n");
            scanf("%d",&a);
            p1->num=a;//....
            p2->next = p1;
            p2 = p1;
            --flag;
        }
        p2->next=NULL;//这里要给最后next不然下面输出的时候就会有错误.
        return head;//我把free删了不然你最后一个节点就没了.
    }
     
};
main(){
    struct Node *result = Create1(5);
    while(result!=NULL)//想输出5个一般都是while语句.你那只能输出一个.
    {
        printf("%d\n",result->num);
        result=result->next;
    }
}
在楼主的基础上修改了下..注释都是错误吧.-_-.1和5的情况都运行的了.
2009-10-22 10:03
蓝色药剂
Rank: 4
等 级:业余侠客
帖 子:43
专家分:204
注 册:2007-11-24
收藏
得分:0 
回复 楼主 zwb1986718
#include <stdio.h>
#include <malloc.h>

// 链表节点
struct Node {
    int num;
    struct Node *next;
};

//
// 链表创建函数,n为节点个数
//
struct Node * CreateList(int n)
{
    // 节点个数小于等于零时,返回空指针
    if(n<=0)
        return (NULL);

    // 处理节点为正数的情况
    int i = n;
    int count = 1;
    struct Node *head,*p,*q;
    while(i--)
    {
        p = (struct Node *) malloc(sizeof(struct Node));
        // printf("请输入一个数字\n");
        // scanf("%d",&p->num);
        p->num = count;
        if(count++ == 1)
            head = q = p;
        else
        {
            q->next = p;
            q = q->next;
            q->next = NULL;
        }        
    }
    //q = NULL;

    return head;
}

//
// 打印链表
//
void PrintList(struct Node * head)
{
    struct Node * p = head;
    if(p==NULL)
    {
        printf(" List is NULL \n");
        return ;
    }

    while(p)
    {
        printf(" num = %4d,        next = %p\n", p->num, p->next);
        p = p->next;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("Auto link list test\n");
    printf(" n = 0:\n");
    PrintList(CreateList(0));
    printf("\n n = 5:\n");
    PrintList(CreateList(5));
    printf("\n n = 10:\n");
    PrintList(CreateList(10));
    printf("\n n = 100:\n");
    PrintList(CreateList(100));
    printf("\n n = 1000:\n");
    PrintList(CreateList(1000));

    getchar();
    return 0;
}

仿照你的思路写的,代码有些不一样,希望有帮助
2009-10-22 11:14
zwb1986718
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2009-9-14
收藏
得分:0 
谢谢各位!!

  你们的代码让我获益匪浅!!
2009-10-22 20:39
快速回复:创建动态链表问题
数据加载中...
 
   



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

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