QQ登录

只需一步,快速开始

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 937|回复: 5

菜鸟求教有关TC实现链表的程序。

[复制链接]
发表于 2003-5-31 18:40:18 | 显示全部楼层 |阅读模式
菜鸟在学《数据结构导论》(for C),现在要做一个链表。不知道谁有有关的源程序,让菜鸟看看。书上的只有一个一个的函数,我不知道怎么样把它们搞成一个程序。我现在只做了初始化一个部分。求表长都是报告有错。我头很大,请大家帮助。
[code:1]
#include<stdio.h>
#include<stdlib.h>

typedef struct node * pointer;
struct node
{
        int data;
        pointer next;
};
typedef pointer lklist;

lklist initiate_lklist()
{
        lklist * t;
->       t=(lklist*)malloc(sizeof(lklist));
        t->next=NULL;
        return (t);
}

int main()
{
         lklist head;
         head=initiate_lklist();
         printf("OK\n");
         return 0;
}
[/code:1]
上面部分通过了运行。它大约是实现了一个head节点,head->next=NULL。下面我要现实一个求表长的过程。
[code:1]
int lengeg_lklist(lklist * head)
{
          lklist p;                    /*P指向头节点*/
          p=head;                  /*计算器初始化*/
          int j=0;
          while(p->next!=NULL)          /*P没有到达尾结点是继续“点数”*/
                     {
                               p=p->next;
                               j++;
                      }
          return(j);
}
[/code:1]
加上上面的程序后,就有指向->处的警告。还有int lenged_lklist到lklist p,这几行的出错提示,我也不知道怎么了。
发表于 2003-5-31 20:17:04 | 显示全部楼层
改称下面这个样子就可以了
#include<stdio.h>
#include<stdlib.h>

typedef struct node * pointer;
struct node
{
        int data;
        pointer next;
} NODE;
typedef pointer lklist;

lklist initiate_lklist()
{
        lklist t;
        t=(lklist)malloc(sizeof(NODE));
        t->next=NULL;
        return (t);
}
int lengeg_lklist(lklist head)
{
          lklist p;
          int j=1;   
          if(head == NULL) return -1;
          p=head;                /*P指向头节点*/   
                                  /*计算器初始化*/
           
         
          while(p->next!=NULL)          /*P没有到达尾结点是继续“点数”*/
                     {
                               p=p->next;
                               j++;
                      }
          return(j);
}

int main()
{
         lklist head;
         head=initiate_lklist();
         printf("Length: %d\n",lengeg_lklist(head));
         printf("OK\n");
         return 0;
}
回复

使用道具 举报

发表于 2003-5-31 20:35:54 | 显示全部楼层
你的源程序里面最严重的错误是sizeof(lklist),这样根本得不到你想要的节点的大小。因为lklist是一个指针,在16位指针的情况下,sizeof(lklist)始终返回固定的大小2,因为16位指针占用2个byte。在32 位指针的情况下,sizeof(lklist)始终返回固定的大小4,因为32位指针占用4个byte。所以你应该取struct node的大小。还有你的程序里面的数据类型表达太混乱,lklist已经是struct node指针,而你定义的lklist *t变成什么东西了?t成了一个二级指针,这应该不是你想要的结果。计算长度的函数里面同样存在这样的问题。最后,在程序退出时记得把链表占用的内存释放。
回复

使用道具 举报

 楼主| 发表于 2003-6-1 11:19:14 | 显示全部楼层
谢谢各位好心的大虾。小生的确没有考虑到lklist是一个指针的问题。现在还想问一下,以下两行在程序中有什么用?
[code:1]
typedef struct node * pointer;
typedef pointer lklist;
[/code:1]
书上说,第一行书上说是声明pointer是一个node类的指针(C中好像叫结构,我喜欢用C+),下一行什么意思就没有说了。是说明lklist和pointer一样是一个node类的指针?那下次再用lklist a的时候,这个a是什么呢??是一个指针,还是一个什么东东??
回复

使用道具 举报

发表于 2003-6-1 18:16:55 | 显示全部楼层
下一行跟上一行一样:)
这么说吧,下一行定义了一个新类型,这个类型实际上就是pointer类型。也即是struct node *类型
回复

使用道具 举报

发表于 2003-6-1 21:44:08 | 显示全部楼层
其实在C++中,只要你不使用STL的话,链表的实现方法跟C语言的一样。
回复

使用道具 举报

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

本版积分规则

GMT+8, 2024-11-15 18:59 , Processed in 0.038538 second(s), 16 queries .

© 2021 Powered by Discuz! X3.5.

快速回复 返回顶部 返回列表