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

问个问题..请帮助!

Buger 发布于 2013-05-03 11:30, 693 次点击
程序代码:
#include <stdio.h>
#include <malloc.h>

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

int CreatLinkList(LinkList L)
{
    LNode *p, *r;
    L = (LinkList)malloc(sizeof(LNode));
    p = r = L;
    printf("请输入创建的长度\n");
    int n, i;
    scanf("%d", &n);
    printf("请输入数字\n");
    for(i = 1; i <= n; i++)
    {
        p = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &p -> data);
        r -> next = p;
        r = p;
    }
    r -> next = NULL;
}

void getElem(LinkList L)
{
    LNode *p = L;
    int j = 0, i;
    printf("请输入要取的元素序号\n");
    scanf("%d", &i);
    while(j < i)
    {
        L = L -> next;
        j++;
    }
    if(j == i) printf("所取的元素是%d\n", p -> data);
}

int main()
{
    LinkList L;
    //InitLinkList(L);   //初始化
    CreatLinkList(L);  //创建
    getElem(L);        //取值
   
//locateElem(&L);     //查找
   
//listInsert(&L);     //插入
   
//listDelete(&L);     //删除
   
//listDestroy(&L);    //销毁
    return 0;
}
请问怎么错我了...我用的尾插法建立的...求懂的朋友帮忙!
9 回复
#2
Buger2013-05-03 12:15
,,
#3
笑傲2013-05-03 13:30
回复 楼主 Buger
#include <stdio.h>
#include <malloc.h>

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

void CreatLinkList(LinkList L)               //既然不返回值就设为void
{
    LNode *p, *r;
    p = r = L;
    printf("请输入创建的长度\n");
    int n, i;
    scanf("%d", &n);
    printf("请输入数字\n");
    for(i = 1; i <= n; i++)
    {
        p = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &p -> data);
        r -> next = p;
        r = p;
    }
    r -> next = NULL;
}

void getElem(LinkList L)
{
    LNode *p = L;
    int j = 0, i;
    printf("请输入要取的元素序号\n");
    scanf("%d", &i);
    while(j < i)
    {
        p = p -> next;                  //这里是p
        j++;
    }
    if(j == i) printf("所取的元素是%d\n", p -> data);
}

int main()
{
    LinkList L = (LinkList)malloc(sizeof(LNode));               //应该要在这里初始化,
    //InitLinkList(L);   //初始化
    CreatLinkList(L);  //创建
    getElem(L);        //取值
    //locateElem(&L);     //查找
    //listInsert(&L);     //插入
    //listDelete(&L);     //删除
    //listDestroy(&L);    //销毁
    return 0;
}
#4
Buger2013-05-03 13:59
程序代码:
但是我这样又为什么错了?
#include <stdio.h>
#include <malloc.h>

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

void InitLinkList(LinkList L)
{
    L = (LinkList)malloc(sizeof(LNode));
    if(!L) printf("初始化失败,内存不足");
    else
    {
        L -> next = NULL;
        printf("初始化成功\n");
    }
}

void CreatLinkList(LinkList L)
{
    LNode *p, *r;
    p = r = L;
    printf("请输入创建的长度\n");
    int n, i;
    scanf("%d", &n);
    printf("请输入数字\n");
    for(i = 1; i <= n; i++)
    {
        p = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &p -> data);
        r -> next = p;
        r = p;
    }
    r -> next = NULL;
}

void getElem(LinkList L)
{
    LNode *p = L;
    int j = 0, i;
    printf("请输入要取的元素序号\n");
    scanf("%d", &i);
    while(j < i)
    {
        p = p -> next;
        j++;
    }
    if(j == i) printf("所取的元素是%d\n", p -> data);
}

int main()
{
    //LinkList L = (LinkList)malloc(sizeof(LNode));
    LinkList L;
    InitLinkList(L);   //初始化
    CreatLinkList(L);  //创建
    getElem(L);        //取值
   
//locateElem(&L);     //查找
   
//listInsert(&L);     //插入
   
//listDelete(&L);     //删除
   
//listDestroy(&L);    //销毁
    return 0;
}
#5
Buger2013-05-03 14:26
在么?
#6
Buger2013-05-03 15:14
还有人?
#7
笑傲2013-05-03 16:22
指针本身也是一个变量。将指针传递给函数以后,函数里的指针和原指针是占用不同内存的两个变量,所以改变函数里的指针不会影响函数外的指针。
如果原指针已被初始化,传递给函数后,内外两个指针仍然是两个不同的变量,但是他们的值是相同的,即两个指针都指向同一个内存地址,所以在函数内使用*(引用)操作符对指向的内存地址赋值,就实现了对函数外指针所指向的内存地址的值的改变,因为内外两个指针都指向同一内存地址。
如果试图通过函数对指针赋值,则可以对函数加入返回值,如:
Node *func(Node *ptr)
 {return ptr = new Node();}   
 Node *p;
  p = func(p);

[ 本帖最后由 笑傲 于 2013-5-3 16:25 编辑 ]
#8
Buger2013-05-03 18:02
以下是引用笑傲在2013-5-3 16:22:43的发言:

指针本身也是一个变量。将指针传递给函数以后,函数里的指针和原指针是占用不同内存的两个变量,所以改变函数里的指针不会影响函数外的指针。
如果原指针已被初始化,传递给函数后,内外两个指针仍然是两个不同的变量,但是他们的值是相同的,即两个指针都指向同一个内存地址,所以在函数内使用*(引用)操作符对指向的内存地址赋值,就实现了对函数外指针所指向的内存地址的值的改变,因为内外两个指针都指向同一内存地址。  
如果试图通过函数对指针赋值,则可以对函数加入返回值,如:
Node *func(Node *ptr)
 {return ptr = new Node();}   
 Node *p;
  p = func(p);

能用你的方法帮我改正确?谢谢!
#9
笑傲2013-05-03 18:40
#include <stdio.h>
#include <malloc.h>

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

LinkList InitLinkList(LinkList L)
{
    L = (LinkList)malloc(sizeof(LNode));
    if(!L) printf("初始化失败,内存不足");
    else
    {
        L -> next = NULL;
        printf("初始化成功\n");
    }
    return L;
}

void CreatLinkList(LinkList L)
{
    LNode *p, *r;
    p = r = L;
    printf("请输入创建的长度\n");
    int n, i;
    scanf("%d", &n);
    printf("请输入数字\n");
    for(i = 1; i <= n; i++)
    {
        p = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &p -> data);
        r -> next = p;
        r = p;
    }
    r -> next = NULL;
}

void getElem(LinkList L)
{
    LNode *p = L;
    int j = 0, i;
    printf("请输入要取的元素序号\n");
    scanf("%d", &i);
    while(j < i)
    {
        p = p -> next;
        j++;
    }
    if(j == i) printf("所取的元素是%d\n", p -> data);
}

int main()
{
    //LinkList L = (LinkList)malloc(sizeof(LNode));
    LinkList L;
    L = InitLinkList(L);   //初始化
    CreatLinkList(L);  //创建
    getElem(L);        //取值
    //locateElem(&L);     //查找
    //listInsert(&L);     //插入
    //listDelete(&L);     //删除
    //listDestroy(&L);    //销毁
    return 0;
}
#10
笑傲2013-05-03 18:53
回复 8楼 Buger
程序代码:
#include <stdio.h>
#include <malloc.h>

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

void InitLinkList(LinkList L)
{
    //L = (LinkList)malloc(sizeof(LNode));
    if(!L) printf("初始化失败,内存不足");
    else
    {
        L -> next = NULL;
        printf("初始化成功\n");
    }
}

void CreatLinkList(LinkList L)
{
    LNode *p, *r;
    p = r = L;
    printf("请输入创建的长度\n");
    int n, i;
    scanf("%d", &n);
    printf("请输入数字\n");
    for(i = 1; i <= n; i++)
    {
        p = (LNode *)malloc(sizeof(LNode));
        scanf("%d", &p -> data);
        r -> next = p;
        r = p;
    }
    r -> next = NULL;
}

void getElem(LinkList L)
{
    LNode *p = L;
    int j = 0, i;
    printf("请输入要取的元素序号\n");
    scanf("%d", &i);
    while(j < i)
    {
        p = p -> next;
        j++;
    }
    if(j == i) printf("所取的元素是%d\n", p -> data);
}

int main()
{
    LinkList L = (LinkList)malloc(sizeof(LNode));
    InitLinkList(L);   //初始化
    CreatLinkList(L);  //创建
    getElem(L);        //取值
   
//locateElem(&L);     //查找
   
//listInsert(&L);     //插入
   
//listDelete(&L);     //删除
   
//listDestroy(&L);    //销毁
    return 0;
}

或者这样,都是直接在你的程序上改的
1