回 帖 发 新 帖 刷新版面

主题:求助:我写的链表实现的程序(C语言)编译通过了但结果不对.

求助:我写的链表实现的程序编译通过了但结果不对.  
 我写了个实现链表的程序,在wintc(相当与tc2.0)里编译通过,但是运行时要输出链表程序给出的结果却不对,请各位帮忙看看.谢谢. 
代码如下: 

/*建立链表并显示*/ 
#include <stdio.h> 

struct myList       /*链表结构*/ 
{                   /*数据*/ 
   int data; 
   struct myList *next; /*链表指针*/ 
}; 

/*建立链表*/ 
struct myList *CreatList(void) 

     int x; 
     struct myList *s,*q,*h; 
     h = (struct myList *)malloc(sizeof(struct myList)); 
     h->next = NULL; 
     q = h; 
     printf("input number:"); 
     scanf("%d",&x); 
     while(x != 0)       /*为链表赋值*/ 
     { 
        s = (struct myList *)malloc(sizeof(struct myList)); 
        s->data = x; 
        q->next = s; 
        printf("input number:"); 
        scanf("%d",&x); 
        s->next = NULL; 
        q = s; 
     } 
     return (h); 


/*输出所有链表的值*/ 

int putList(struct myList *head) 

     int i = 0; 
     if(head->next == NULL)     /*若是空链表则返回*/ 
     { 
        return 0; 
      } 
     while(head->next != NULL)  /*输出链表,这里运行结果不对*/ 
     { 
         i++; 
         printf("the %d number in list is:%d\n",i,head->data); 
         head = head ->next; 
     } 
     return 1; 


main() 

   struct myList *my; 
   my = CreatList();  /*建立链表*/ 
   if(putList(my) == 0) /*输出链表,这里运行结果不对*/ 
      printf("The input list is empty!"); 
   while(my->next != NULL) 
   { 
      free(my); 
      my = my->next; 
   } 
   printf("over,press any key to end"); 
   getch(); 
   clrscr(); 


运行时输入1(回车)2(回车)3(回车)0(回车)       其中"0"代表结束输入 
程序给出的输出为: 
the 1 number in list is:-30170 
the 2 number in list is:1 
the 3 number in list is:2 
over,press any key to end 
第一个输出完全错了, 
剩下两个数字对了但位置不对 
我设想的正确的应为: 
the 1 number in list is:1 
the 2 number in list is:2 
the 3 number in list is:3 
over,press any key to end 
请各位帮忙看看哪里错了,谢谢帮助!  
 
 
[em10]

回复列表 (共14个回复)

11 楼


对啊!数组num加了个-1就运行正确了,太谢谢您了.很抱歉因为"一个人在一个主题中所得的专家分最多不能超过50分!"的规定所以没法给您加分了.谢谢您.

12 楼

另外,
void DispLinkList(LinkList *head)
{
   LinkList *p;  /*我忽然想到,直接用head是不是函数调完了head        的值也变了?所以加了个p*/
   int i = 0;
   p=head;
   以下省略
}
这个问题我也想求教一下。不过我个人是觉得head是不变的。你在实际调用这个函数的时候,系统重新开辟了一个head指针,这个head是指向主体函数head指针传递的地址的。但在函数里head指针的变化,是不影响到这个函数外的head指针,因为2个指针,本身的地址是不同的。

我也不知道对不对。不过好象是这样。
[/quote]

这个问题我编了个测试程序,您是对的,head的值的确不会变.
程序如下:
void try(int *b)
{
   int c = 2;
   b = &c;
   printf("b in function %d\n",*b);
}

void main()
{
    int a = 3,*b;
    b = &a;
    printf("b before function %d\n", *b);
    try(b);
    printf("b after function %d\n", *b);
    getch();
    clrscr();
}
运行结果为:
b before function 3
b in function 2
b after function 3
说明在调用try前后指针b的值没变,谢谢您!

13 楼

lol

另外,你一直在错头结点的问题。

你已经定义了一个头结点 数据域为随机  指针域为空。 开始。
这个时候的表有了1个结点。但,对于表来说,是空表,是个有头结点的空表。所以你判断表空要用head->next是否为空,而不是本身head是否为空。这个情况和没头结点的链表是不同的。


你的表 是这样的.  随机数->1->2->3->4->NULL
                  头结点
你一直在打印 头结点 1  2  3 这4个结点的数据域,而少了第5个结点(也就是链表的第4个元素)。  

14 楼


谢谢您的帮助,谢谢![em2]

我来回复

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