| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 265 人关注过本帖
标题:奇怪的链表问题 for循环无效!
只看楼主 加入收藏
GUnever
Rank: 2
等 级:论坛游民
帖 子:59
专家分:25
注 册:2012-3-3
结帖率:95.24%
收藏
已结贴  问题点数:10 回复次数:2 
奇怪的链表问题 for循环无效!
#include<stdio.h>
#include<stdlib.h>

#define N 20

/* User Code Begin(Limit: lines<=5, lineLen<=60, 考生可在本行后添加代码、仅5行、行长<=60字符,功能是节点类型Link定义) */
struct Link
{
    struct Link *next;
    int data;
};
/* User Code End(考生添加代码结束) */

void dispLink(struct Link *Head);  /* 根据给定的链首Head,显示整个链表中的数据,同时检查两次使用的链表是否刚好反序 */
/* User Code Begin(Limit: lines<=2, lineLen<=60, 考生可在本行后添加代码、仅2行、行长<=60字符,功能是用户自定义函数的原型声明) */
struct Link*creatLink();
struct Link*reverseLink(struct Link*head);
/* User Code End(考生添加代码结束) */

int main(void)
{
    struct Link *Head;
    Head = creatLink();  /* 创建新链表   这一点还是可以看出函数的名字,们没有传参 拿自己不是要在里面定义一个 然后返回*/
    printf("\nbefore:");
    dispLink(Head);

    Head = reverseLink(Head);  /* 反转链表 */
    printf("\nafter:");
    dispLink(Head);

    return 0;
}

void dispLink(struct Link *Head)
{
    static struct Link *oLink[2][N];
    static int callNumber = -1;
    int i = 0;

    callNumber++;
    if (callNumber > 1)
    {
        printf("Error, call invalid!\n");
        return ;
    }

    while (Head != NULL)
    {
        oLink[callNumber][i] = Head;
        i++;
        printf("%d ", Head->data);
        Head = Head->next;
    }
    printf("\n");

    if (1 == callNumber)
    {
        for (i=0; i<N; i++)
        {
            if (oLink[0][i] != oLink[1][N-1-i])
            {
                printf("Error, Link not reverse!\n");
                return ;
            }
        }
    }
}

/* User Code Begin(考生在此后根据设计需要完成程序的其它部分,行数不限) */
struct Link*creatLink()
{
    int n=0;
    struct Link *head,*p1,*p2;
    p1=p2=(struct Link*)malloc(sizeof(struct Link));
    p1->data=n;
    head=NULL;
    while(n<N-1)
    {
        if(head==NULL)
        {
            head=p1;
        }
        else
        {
            p2->next=p1;
            p2=p1;
        }
        p1=(struct Link*)malloc(sizeof(struct Link));
        p1->data=n+1;
        n++;
    }
    p2->next=p1;
    p2=p1;
    p2->next=NULL;
    return head;

}

struct Link*reverseLink(struct Link*head)
{
    int a[20],i;
    struct Link *p1,*p2;
    p2=p1=head;
    for(i=0;i<20;i++,p1=p1->next)
    {
        a[i]=p1->data;
    }
    for(i=19;i>-1;i--,p2=p2->next)
    {
        p2->data=a[i];
    }
    return head;
}
这个程序的主要功能是将一个链表反转输出 先要自己建立一个链表;
但是很奇怪的是第一次按正常顺序输出链表的时候就将head指到了链表的末尾,后来应为自己没有注意到这个问题,就按照head还是指向最前面的方法将整个链表的所有元素反转了一遍。(并没有将链表反转)  但是输出的确是正确的!大家可以试一下 照理论来说应该是乱码啊 head再往后面指应该都是未知数了;
  还有一个很奇怪的问题,也许跟上个问题有关。就是
 for(i=0;i<20;i++,p1=p1->next)
    {
        a[i]=p1->data;
    }
这个for在调程的时候自己就运行一次就跳出来了 但是i确实等于20了···
太奇怪了 太奇怪!







搜索更多相关主题的帖子: include 用户 
2012-04-09 13:45
Wikyo_hoho
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:31
专家分:188
注 册:2012-3-12
收藏
得分:10 
for调试是运行里面语句20次啊,你调试错了吧?还是VC犯啥毛病了?
2012-04-09 19:07
GUnever
Rank: 2
等 级:论坛游民
帖 子:59
专家分:25
注 册:2012-3-3
收藏
得分:0 
回复 2楼 Wikyo_hoho
那就算调试没有问题 但是头指针在第一次输出的时候已经指向了末尾了 我后面的反转程序还在往后移动指针 怎么输出还是正确的?
2012-04-09 20:58
快速回复:奇怪的链表问题 for循环无效!
数据加载中...
 
   



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

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