| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 352 人关注过本帖
标题:简单的链表问题,求助。
只看楼主 加入收藏
ai8343512
Rank: 2
等 级:论坛游民
帖 子:75
专家分:94
注 册:2011-8-7
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:4 
简单的链表问题,求助。
对链表结构不是很了解,每个问号都是一个问题,如下:
程序代码:
# include <stdio.h>
# include <stdlib.h>
# define N 8

typedef struct list  //这个list是构建链表必须需要的吗?或者说是链表申明所特有必须加上去的?
{
    int data;
    struct list * next;
}SLIST ;               //SLIST不是结构体变量?不然怎么可以在下一行又定义一个*p变量。
//那以上定义的结构体类型名为什么不可以这样定义吗?struct list SLIST{……}

void fun(SLIST * p)   //SLIST可以单独用来做类型名,并且可以以此来定义头指针?
{
    SLIST *t, *s;

    t = p->next;  //这句是不是表明t已经存放了头结点指针域的内容(也就是下一个结点的地址)?
    s = p;

    while (t->next != NULL)  //如果上句成立,那这句括号中就是指:首结点指针域的内容不为空则成立?
    {
        s = t;
        t = t->next;
    }

    printf("%d", t->data);
    s->next=NULL;

    free(t);       //链表结构也是动态的存储数据?
}

SLIST * creatlist(int *a)    
{
    SLIST *h, *p, *q;
    int i;

    h = p = (SLIST *)malloc(sizeof(SLIST));

    for(i=0; i<N; i++)
    {
        q = (SLIST *)malloc(sizeof(SLIST));
        q->data = a[i];   //这句是不是表明q = &a[i]?
        p->next = q;      //令p作为头指针?
        p = q;              //p向后进一位。
    }                     //循环结束了以后,p存储的是最后一个结点的地址,那返回给h的岂不也是最后一个结点的地址?
    p->next = 0;          //0和NULL可以互换么?

    return h;
}

void outlist(SLIST *h)
{
    SLIST *p;

    p = h->next;         //如果h是头指针的话,p就存储了头结点的地址?
    if (p == NULL)       //判断链表是否是空结点。
        printf("\nThe list is NULL!\n");
    else
    {
        printf("\nhead");
        do
        {
            printf("->%d", p->data);
            p = p->next;
        }while(p != NULL);
        printf("->End\n");
    }
}

int main(void)
{
    SLIST * head;
    int a[N] = {11, 12, 15, 18, 19, 22, 25, 29};

    head = creatlist(a);

    printf("\nOutput from head:\n");
    outlist(head);
    printf("\nOutput from tail:\n");

    while (head->next!=NULL)
    {
        fun(head);
        printf("\n\n");
        printf("\nOutput from head again:\n");
        outlist(head);
    }

    return 0;
}


[ 本帖最后由 ai8343512 于 2011-8-19 16:17 编辑 ]
2011-08-19 16:15
voidx
Rank: 12Rank: 12Rank: 12
来 自:邯郸
等 级:火箭侠
帖 子:1250
专家分:3538
注 册:2011-4-7
收藏
得分:10 
程序代码:
# include <stdio.h>
# include <stdlib.h>
# define N 8

typedef struct list                         // "list" 不是必须有,但是如果没有的话,你下面那个 struct list * next; 要怎么写?
{
    int data;
    struct list * next;
}SLIST;                                     // SLIST不是结构体变量,是一个自定义类型,因为你在 struct 前加了 typedef。
                                            // 当然不可以这样定义:struct list SLIST{……} ,但是可以写成 struct SLIST{……}。
                                            // 不过,你后面定义变量的时候就要写 struct list ... 用 typedef 就是为了方便。

void fun(SLIST * p)                         // SLIST就是个类型名,所以,SLIST当然可以单独用来做类型名
{
    SLIST *t, *s;

    t = p->next;                            // 这句执行后 t 指向 p 的下一个结点
    s = p;

    while (t->next != NULL) {               // 这句括号中是指 t 不是链表的最后一个结点
        s = t;
        t = t->next;
    }

    printf("%d", t->data);
    s->next = NULL;

    free(t);                                // 链表当然是动态的
}

SLIST * creatlist(int *a)
{
    SLIST *h, *p, *q;
    int i;

    h = p = (SLIST*)malloc(sizeof(SLIST));

    for (i = 0; i < N; i++) {
        q = (SLIST*)malloc(sizeof(SLIST));
        q->data = a[i];                     // 这句不表明 q == &a[i],只是使 p->data 的值与 a[i] 相同
        p->next = q;                        // 把 q 链到 p 后面
        p = q;                              // 使 p 指向 q 所指向的结点
    }                                       // 循环结束了以后,p存储的是最后一个结点的地址,那返回给h的岂不也是最后一个结点的地址?
                                            // ...
    p->next = 0;                            // NULL == 0
    
    return h;                               // 人家这里返回的是 h ,管上面的 p 毛事
}

void outlist(SLIST *h)
{
    SLIST *p;

    p = h->next;                             // 如果h是头指针的话,p存储了第一个结点的地址,而不是头结点的地址
    if (p == NULL)                           // 判断链表是否为空。链表是链表,结点是结点,两个概念怎么可能相等
        printf("\nThe list is NULL!\n");
    else{
        printf("\nhead");
        do {
            printf("->%d", p->data);
            p = p->next;
        } while (p != NULL);
        printf("->End\n");
    }
}

int main(void)
{
    SLIST * head;
    int a[N] = { 11, 12, 15, 18, 19, 22, 25, 29 };

    head = creatlist(a);

    printf("\nOutput from head:\n");
    outlist(head);
    printf("\nOutput from tail:\n");

    while (head->next != NULL) {
        fun(head);
        printf("\n\n");
        printf("\nOutput from head again:\n");
        outlist(head);
    }

    return 0;
}


[ 本帖最后由 voidx 于 2011-8-19 17:02 编辑 ]
2011-08-19 17:01
无诲今生
Rank: 8Rank: 8
来 自:桂林理工大学
等 级:蝙蝠侠
威 望:2
帖 子:373
专家分:726
注 册:2009-5-11
收藏
得分:10 
问题这么多。
1、
typedef struct list  {
    int data;
    struct list * next;
}SLIST ;
这个是类型的定重命名。list这个是结构体名字,可以换成基他的合法名字
struct list  {
    int data;
    struct list * next;
}这个结构体,是一个类型,和int等都是数据类型,typedef int myint; 这个懂了吧,
2、SLIST 这个不是结构体变量,是一个自己重命名的数据类型。
程序代码:
# include <stdio.h>
# include <stdlib.h>
# define N 8

typedef struct list  //这个list是这个结构体名,可以换成其他名字
{
    int data;
    struct list * next;
}SLIST ;               //SLIST不是结构体变量 ,是这个结构体的另外一个类型名。
//那以上定义的结构体类型名为什么不可以这样定义吗?struct list SLIST{……}
//答:不可以这样,结构体都不是这样定义的
void fun(SLIST * p)   //SLIST可以单独用来做类型名,并且可以以此来定义头指针? 、答:是的
{
    SLIST *t, *s;

    t = p->next;  //这句是不是表明t已经存放了头结点指针域的内容(也就是下一个结点的地址)?、答:是的,跳过第一个结点,因为你下面创建链表时第一个结点都没有存有你想存的数据
    s = p;

    while (t->next != NULL)  //如果上句成立,那这句括号中就是指:首结点指针域的内容不为空则成立?、答:不是的,表示它指向下一个结点是空,即是最后的一个了,t->next==NULL不代表内容为空的
    {
        s = t;
        t = t->next;
    }

    printf("%d", t->data);
    s->next=NULL;

    free(t);       //链表结构也是动态的存储数据?、答:应该说是动态地分配内存,你这里是释放最后一个结点的内存空间
}

SLIST * creatlist(int *a)   
{
    SLIST *h, *p, *q;
    int i;

    h = p = (SLIST *)malloc(sizeof(SLIST));

    for(i=0; i<N; i++)
    {
        q = (SLIST *)malloc(sizeof(SLIST));
        q->data = a[i];   //这句是不是表明q = &a[i]?、答:不是的,这里是存内容了,存数组a的第i个数据
        p->next = q;      //令p作为头指针?、答:是使之前已经连在一起的链表的最后一个结点的next变量指向现在刚分配的结点地址p使其连在一起
        p = q;              //p向后进一位。、答:是的
    }                     //循环结束了以后,p存储的是最后一个结点的地址,那返回给h的岂不也是最后一个结点的地址?、答:不是的,p是指向最后一个结点了,但h没有改变,它是指向头结点的
    p->next = 0;          //0和NULL可以互换么?、答:是的,在这里可以互换

    return h;
}

void outlist(SLIST *h)
{
    SLIST *p;

    p = h->next;         //如果h是头指针的话,p就存储了头结点的地址?、答:这里只是跳过第一个结点,因为你第一个结点没有存有你要的数据
    if (p == NULL)       //判断链表是否是空结点。
        printf("\nThe list is NULL!\n");
    else
    {
        printf("\nhead");
        do
        {
            printf("->%d", p->data);
            p = p->next;
        }while(p != NULL);
        printf("->End\n");
    }
}

int main(void)
{
    SLIST * head;
    int a[N] = {11, 12, 15, 18, 19, 22, 25, 29};

    head = creatlist(a);

    printf("\nOutput from head:\n");
    outlist(head);
    printf("\nOutput from tail:\n");

    while (head->next!=NULL)
    {
        fun(head);
        printf("\n\n");
        printf("\nOutput from head again:\n");
        outlist(head);
    }

    return 0;

收到的鲜花
  • ai83435122011-08-19 20:59 送鲜花  5朵   附言:直接解决我不明白的地方,谢谢。

顺境逆境切莫止境,得意失意切莫在意。
2011-08-19 17:01
ai8343512
Rank: 2
等 级:论坛游民
帖 子:75
专家分:94
注 册:2011-8-7
收藏
得分:0 
谢谢,虽然这些问题很简单,但看到自己那么多的知识点不懂所以就问了。

思考不应该由他人来指导,会思考的人不需要你来提醒他去思考一个简单的问题。
2011-08-19 18:41
ai8343512
Rank: 2
等 级:论坛游民
帖 子:75
专家分:94
注 册:2011-8-7
收藏
得分:0 
回复 2楼 voidx
对于这个函数部分,我还是有个地方不懂,特意请教,见谅。
程序代码:
SLIST * creatlist(int *a)    
{
    SLIST *h, *p, *q;
    int i;
   
    h = p = (SLIST *)malloc(sizeof(SLIST));   //这是不是意味着h伴随着p的变化而变化?
   
    for(i=0; i<N; i++)
    {
        q = (SLIST *)malloc(sizeof(SLIST));
        q->data = a[i];  
        p->next = q;     
        p = q;             
    }                    
    p->next = 0;         
   
    return h;                                 //这个函数是如何通过h传回头指针的?我怎么觉得h在跟着p一起变?
}

思考不应该由他人来指导,会思考的人不需要你来提醒他去思考一个简单的问题。
2011-08-19 21:10
快速回复:简单的链表问题,求助。
数据加载中...
 
   



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

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