回 帖 发 新 帖 刷新版面

主题:关于链表的基础问题。

#include "stdio.h"
#include "stdlib.h"

typedef int BOOL;
const int FALSE = 0;
const int TRUE = 1;

typedef struct list
{
    int data;
    struct list *next;
}list;

BOOL create(list *head)
{
    head=(list *)malloc(sizeof (list));
    if (head == NULL)
        return 0;
    head->data = -1;
    head->next = NULL;
    return 1;
}

BOOL add(list *l,int *data)
{
    list *temp,*a;
    a = l;
    temp = (list *)malloc(sizeof (list));
    if (temp==0)
        return FALSE;

    while (1)
    {
        
        if (a->next !=NULL)
            a= a->next;
        else break;
    }
    a->next = temp;
    temp->data = *data;
    temp->next = NULL;
    return TRUE;
}
void main ()
{
    list *a=NULL;

    int b[5]={1,2,3,4,5},i;
    create(a);

      for (i=0;i<=4;i++)
    {

         add(a,&b[i]);
        
    }


}

目的是实现建立空链表和在表尾处添加新结点。

问题是我的create函数出毛病了,以a为head指针建立不起来链表,错误类似形参,实参。。指针做为传递,应该不会出这个毛病吧。还是在malloc上有什么特殊的说法?高手指点一二,谢谢啦  

回复列表 (共5个回复)

沙发

BOOL create(list *head)
{
    head=(list *)malloc(sizeof (list));
    if (head == NULL)
        return 0;
    head->data = -1;
    head->next = NULL;
    return 1;
}
head=(list *)malloc(sizeof (list));这一句,head被重新赋值
但是没有返回,所以a的值还是原来的没变
解决方法:
1.create(&a);
BOOL create(list **head)
{
    (*head)=(list *)malloc(sizeof (list));
    if (*head == NULL)
        return 0;
    (*head)->data = -1;
    (*head)->next = NULL;
    return 1;
}
2.a=create(a);
list * create(list *head)
{
    head=(list *)malloc(sizeof (list));
    if (head == NULL)
        return NULL;
    head->data = -1;
    head->next = NULL;
    return head;
}
两种皆可

板凳

谢谢
那我如果把main()里改成
list a;
create(&a);
也可以吧。。。
看来对形参实参还是理解不够,只知其然了。

3 楼

同学你的链表很奇怪呀!
是你自己弄的吧!,
应该建一个节点类,一个表类。
如果节点的成员是公有的,将他的对象作表类的私有成员;
否则,表类申明为节点类的友元。
这样就不会破坏表类的封装性了!
struct里面的东西都相当于是共有的!

4 楼

#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"

typedef int BOOL;
const int FALSE = 0;
const int TRUE = 1;

typedef struct list
{
    int data;
    struct list *next;
}list;

bool create(list **head)
{
    (*head)=(list *)malloc(sizeof (list));
    if ((*head) == NULL)
        return 0;
    (*head)->data = -1;
    (*head)->next = NULL;
    return 1;
}

bool add(list *l,int *data)
{
    list *temp,*a;
    a = l;
    temp = (list *)malloc(sizeof (list));
    if (temp==0)
        return FALSE;

    while (1)
    {
        
        if (a->next !=NULL)
            a= a->next;
        else break;
    }
    a->next = temp;
    temp->data = *data;
    temp->next = NULL;
    return TRUE;
}
void main ()
{
    list *a=NULL;

    int b[5]={1,2,3,4,5},i;
    create(&a);

    for (i=0;i<=4;i++)
    {
        add(a,&b[i]);
    }
    int aaa=0;
}

5 楼

create参数不是传入指针,而是应该传入地址,

我来回复

您尚未登录,请登录后再回复。点此登录或注册