data.h
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#ifndef _DATA_H_
#define _DATA_H_
typedef struct node
{
int data;
struct node *next;
}node;
#endif
create.c
#include "data.h"
node *create()
{
node *head;
node *tail, *append_node;
int i,n,data;
head = (node *)malloc(sizeof(node));
head->next = NULL;
tail = head;
printf("Input the number of the elements: ");
scanf("%d",&n);
for(i = 0; i < n; i++)
{
append_node = (node *)malloc(sizeof(node));
printf("Input the %dth data: ",i + 1);
scanf("%d",&data);
append_node->data = data;
tail->next = append_node;
tail = append_node;
tail->next = NULL;
}
return head;
}
show.c
#include "data.h"
void show(node *head)
{
if(head == NULL)
return;
node *p = head->next;
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}
find_mid.c
#include "data.h"
node *find_mid(node *head)
{
int i = 0;
int j = 0;
node *current = NULL;
node *middle = NULL;
current = head->next;
middle = head->next;
while (current != NULL)
{
if (i / 2 > j)
{
j++;
middle = middle->next;
}
i++;
current = current->next;
}
return middle;
}
isLoop.c
#include "data.h"
/*
* 判断是否存在回环
* 如果存在,start存放回环开始的节点
* */
#define IS_LOOP 1
#define NO_LOOP 0
int isLoop(node *head, node **start)
{
node *p1 = head;
node *p2 = head;
if (head == NULL || head->next == NULL)
return NO_LOOP;
do
{
p1 = p1->next;/* p1走一步 */
p2 = p2->next->next;/* p2走二步 */
}while (p2 && p2->next && p1 != p2);
if (p1 == p2)
{
*start = p1;/*p1(p2)为回环的开始节点 */
return IS_LOOP;
}
else
return NO_LOOP;
}
rever.c
#include "data.h"
node *rever(node *head)
{
node *p, *q, *r;
/* 链表为空 */
if (head->next == NULL)
return head;
p = head->next;
q = p->next;/* 保存原来的第二个节点 */
p->next = NULL; /* 原来第一个节点变为末节点 */
while (q != NULL)
{
r = q->next;
q->next = p;
p = q;
q = r;
}
head->next = p; /* 新的头结点为原来的末节点 */
return head;
}
merge_recursive.c
#include "data.h"
node *merge_recursive(node *head1, node *head2)
{
node *merge_head = NULL;
if (head1 == NULL)
return head2;
if (head2 == NULL)
return head1;
if (head1->data < head2->data)
{
merge_head = head1;
merge_head->next = merge_recursive(head1->next, head2);
}
else
{
merge_head = head2;
merge_head->next = merge_recursive(head1, head2->next);
}
return merge_head;
}
main.c
#include "data.h"
extern node *create();
extern void show();
extern node *find_mid(node *head);
extern node *rever(node *head);
extern node *merge_recursive(node *head1, node *head2);
extern int isLoop(node *head, node **start);
int main()
{
#ifdef TEST_NORMAL
node *head = NULL;
node *mid = NULL;
head = create();
show(head);
head = rever(head);
show(head);
mid = find_mid(head);
printf("mid node is %d\n", mid->data);
#endif
#ifdef TEST_MERGE
node *head1 = NULL;
node *head2 = NULL;
node *merge_head = NULL;
head1 = create();
show(head1);
head2 = create();
show(head2);
merge_head = merge_recursive(head1, head2);
show(merge_head->next);
#endif
#ifdef TEST_LOOP
node *head = create();
#ifdef MAKE_A_LOOP
node *start = head->next->next->next;/* 使第3个节点为回环的开始位置 */
start->next = head->next;/* 回环连接到第一个节点 */
#else
node *start = NULL;
#endif
printf("%s\n",isLoop(head, &start) == 1 ? "loop" : "no loop");
#endif
return 0;
}