画圈的哪几部分是什么意思

img

img


#include

typedef struct Node *Node;
struct Node
{
int data;
Node Next;
};
Node CList()
{
int d;
Node head = (Node)malloc(sizeof(struct Node)),q;
head -> Next = NULL;
q = head;
while(scanf("%d",&d)&&d!=-1)
{
Node p = (Node)malloc(sizeof(struct Node));
p -> data = d;
p -> Next = NULL;
q -> Next = p;
q = p;
}
return head;
}
Node Merge(Node a,Node b)
{
a = a -> Next;
b = b -> Next;
Node head = (Node)malloc(sizeof(struct Node));
head -> Next = NULL;
Node q = head;
while(a || b)
{
Node p = (Node)malloc(sizeof(struct Node));
p -> Next = NULL;
if(a == NULL || a -> data > b -> data)
{
p -> data = b -> data;
b = b -> Next;
q -> Next = p;
q = p;
}
else
{
p -> data = a -> data;
a = a -> Next;
q -> Next = p;
q = p;
}
}
return head;
}
void printL(Node a)
{
a = a -> Next;
if(a == NULL)printf("NULL");
int flag = 0;
while(a)
{
if(flag)printf(" %d",a -> data);
else printf("%d",a -> data);
a = a -> Next;
flag = 1;
}
}
int main()
{
Node a = CList();
Node b = CList();
Node c = Merge(a,b);
printL(c);
}

第一个圈是因为链表是烧饼链表,所有有效节点从next开始
while(a || b)是判断如果有一个链表已经到遍历完毕,则循环结束
第三个圈中的if(a==NULL)是废话,因为while条件已经排除a为空的情况了。后半部分是判断a和b节点值的大小,进行排序