c语言循环单链表的创建.有句程序不明白高人帮忙指导一下,十分感谢

[复制链接]
查看11 | 回复3 | 2011-7-28 21:46:51 | 显示全部楼层 |阅读模式
main方法让我省略了,功能是创建 一个循环单链表
#include "malloc.h"
#include "stdio.h"
typedef struct node{
        char info;
        struct node *next;
}HeadLink;
HeadLink *cyclecreat(){
        HeadLink *head,*q,*p;
        char c;
        head=(HeadLink *)malloc(sizeof(HeadLink));
        head->next=head;
/*头指针被下面的指针指向*/
        q=head;
/*q指向了头指针*/
        while((c=getchar())!='\n'){
                p=(HeadLink *)malloc(sizeof(HeadLink));
                p->info=c;
                if(head->next==head){ /*能否把if的的功能详细的解读一下*/
                        head->next=p;

                        q=p;

                }
                else{
                        q->next=p;

                        q=p;
                }
        }
        q->next=head;
        return head;
}
void print(HeadLink *tail){
        HeadLink *p;
        p=tail->next->next;
/*这句程序是什么意思*/
        printf("\n");
        while(p!=tail->next){
                putchar(p->info);
                putchar(' ');
                p=p->next;
        }
        putchar('\n');
}

回复

使用道具 举报

千问 | 2011-7-28 21:46:51 | 显示全部楼层
楼主第一个函数是一个数据存储的函数吧先解释下3个指针变量的作用*head:用于保存头文件的指针*p:用于指向当前的下一个地址,只起到临时作用*q:用于保存当前位置的地址函数逻辑是用*head保存头指针,然后先移动*p,如果*p指向的是*head,说明这条链只有一个节点,就是头地址(头指针指向的地址),既然要继续,所以需要if(head->next==head)这句来判断是否*p指向的是头地址;如果不是*p指向的不是头地址,那么*p前移,然后*q也前移,*p一定要比*q先前移,所以*p在*q前面。如果输入完毕了,及输入了回车号,结束输入,然后*q指向头*head。 那个print()函数是用来输出的,输出除了第一个...
回复

使用道具 举报

千问 | 2011-7-28 21:46:51 | 显示全部楼层
p=tail->next->next; 相当于p=(tail->next)->next; tail的next成员的next成员,其他它们都是 node 类型如果tail是当前位置,那么tail->next->next就是获取当前位置往后移动两个位置的地址
希望回答对你有帮助...
回复

使用道具 举报

千问 | 2011-7-28 21:46:51 | 显示全部楼层
if(head->next==head){ /*能否把if的的功能详细的解读一下*/这句很简单啊,就是判断head->next是否等于head,因为你在程序最初定义了head->next=head; ,所以程序第一次循环的时候会判断为真。然后head->next=p;所以head->next不再等于head。 后边的语句是控制循环的,为了...
回复

使用道具 举报

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

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行