c语言循环单链表的创建.有句程序不明白高人帮忙指导一下,十分感谢
main方法让我省略了,功能是创建一个循环单链表#include"malloc.h"#include"stdio.h"typedefstructnode{charinfo...
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');
} 展开
#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');
} 展开
3个回答
展开全部
楼主第一个函数是一个数据存储的函数吧
先解释下3个指针变量的作用
*head:用于保存头文件的指针
*p:用于指向当前的下一个地址,只起到临时作用
*q:用于保存当前位置的地址
函数逻辑是用*head保存头指针,然后先移动*p,如果*p指向的是*head,说明这条链只有一个节点,就是头地址(头指针指向的地址),既然要继续,所以需要if(head->next==head)这句来判断是否*p指向的是头地址;如果不是*p指向的不是头地址,那么*p前移,然后*q也前移,*p一定要比*q先前移,所以*p在*q前面。
如果输入完毕了,及输入了回车号<CR>,结束输入,然后*q指向头*head。
那个print()函数是用来输出的,输出除了第一个元素以后的字母。
p=tail->next->next这句话就是p指向tail的下一个的下一个元素的地址,首先,p的初始值是上面的head头地址的内容,里面什么都没有,所以要一个next指向下一个,那么再下一个,就是第二个字母了,具体为什么要从第2个字母开始输出,就要问你了,不懂这个print()的目的。
哈哈,你的第一个函数返回的应该是q
先解释下3个指针变量的作用
*head:用于保存头文件的指针
*p:用于指向当前的下一个地址,只起到临时作用
*q:用于保存当前位置的地址
函数逻辑是用*head保存头指针,然后先移动*p,如果*p指向的是*head,说明这条链只有一个节点,就是头地址(头指针指向的地址),既然要继续,所以需要if(head->next==head)这句来判断是否*p指向的是头地址;如果不是*p指向的不是头地址,那么*p前移,然后*q也前移,*p一定要比*q先前移,所以*p在*q前面。
如果输入完毕了,及输入了回车号<CR>,结束输入,然后*q指向头*head。
那个print()函数是用来输出的,输出除了第一个元素以后的字母。
p=tail->next->next这句话就是p指向tail的下一个的下一个元素的地址,首先,p的初始值是上面的head头地址的内容,里面什么都没有,所以要一个next指向下一个,那么再下一个,就是第二个字母了,具体为什么要从第2个字母开始输出,就要问你了,不懂这个print()的目的。
哈哈,你的第一个函数返回的应该是q
展开全部
if(head->next==head){ /*能否把if的的功能详细的解读一下*/
这句很简单啊,就是判断head->next是否等于head,因为你在程序最初定义了head->next=head; ,所以程序第一次循环的时候会判断为真。然后head->next=p;所以head->next不再等于head。
后边的语句是控制循环的,为了防止无限循环,保证所有节点只被遍历一次。
PS:我不知道你的程序是否能够完美运行,我只是从语句猜测你的意思。
这句很简单啊,就是判断head->next是否等于head,因为你在程序最初定义了head->next=head; ,所以程序第一次循环的时候会判断为真。然后head->next=p;所以head->next不再等于head。
后边的语句是控制循环的,为了防止无限循环,保证所有节点只被遍历一次。
PS:我不知道你的程序是否能够完美运行,我只是从语句猜测你的意思。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
p=tail->next->next; 相当于p=(tail->next)->next;
tail的next成员的next成员,其他它们都是 node 类型
如果tail是当前位置,那么tail->next->next就是获取当前位置往后移动两个位置的地址
希望回答对你有帮助
tail的next成员的next成员,其他它们都是 node 类型
如果tail是当前位置,那么tail->next->next就是获取当前位置往后移动两个位置的地址
希望回答对你有帮助
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询