单链表

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;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值