链表的合并

我先是设计了一个单链表,完了之后插入数据,啥也不说,直接show code

linklist.h:

#ifndef _LINKLIST_H_
#define _LINKLIST_H_


//数据节点
typedef struct _link_list_node link_list_node;

struct _link_list_node {
	int data;
	link_list_node *next;
};


//头节点
typedef struct _t_link_list{
	int length;
	link_list_node *next;
}t_link_list;

t_link_list *create_list();
int get_len(t_link_list *t_list);
//这里的节点我不在malloc分配空间,直接在栈上面进行空间分配
int insert_node(t_link_list *t_list,link_list_node *node,int pos);
link_list_node *get_node(t_link_list *t_list,int pos);
link_list_node *delete_node(t_link_list *t_list,int pos);
//链表的合并
void add_back(t_link_list *t_list,link_list_node *node);
void merge_list(t_link_list *p_res,t_link_list *t_list1,t_link_list *t_list2);

#endif

实现文件:linklist.c

#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"


t_link_list *create_list()
{
	t_link_list *t_list = (t_link_list*)malloc(sizeof(t_link_list));
	if(t_list != NULL) {
		t_list->length = 0;
		t_list->next = NULL;
	}
	return t_list;
}

//节点类型转换
link_list_node *conv_node_type(t_link_list *t_list) {
	link_list_node *p_cur = (link_list_node*)t_list;
	return p_cur;
}

int get_len(t_link_list *t_list)
{
	int res = -1;
	if(t_list != NULL) {
		res = t_list->length; 
	}
	return res;
}
//这里的节点我不在malloc分配空间,直接在栈上面进行空间分配
int insert_node(t_link_list *t_list,link_list_node *node,int pos)
{
	int res = t_list != NULL && node != NULL && pos >=0 && pos <= get_len(t_list);
	if(res) {
		link_list_node *p_cur = conv_node_type(t_list);
		int i;
		for(i = 0;i < pos;i++) {
			p_cur = p_cur->next;
		}
		link_list_node *p_next = p_cur->next;
		node->next = p_next;
		p_cur->next = node;
		t_list->length++;
	}
	return res;
}

link_list_node *get_node(t_link_list *t_list,int pos) 
{
	link_list_node *res = NULL;
	if(t_list != NULL && pos >= 0 && pos < get_len(t_list)) {
		link_list_node *p_cur = conv_node_type(t_list);
		int i;
		for(i = 0;i < pos;i++) {
			p_cur = p_cur->next;
		}
		res = p_cur->next;
	}
	return res;
}

link_list_node *delete_node(t_link_list *t_list,int pos) 
{
	link_list_node *res = get_node(t_list,pos);
	if(res != NULL && t_list != NULL && pos >= 0 && pos < get_len(t_list)) {
		link_list_node *p_cur = conv_node_type(t_list);
		int i;
		for(i = 0;i < pos;i++) {
			p_cur = p_cur->next;
		}
		link_list_node *p_del = p_cur->next;
		p_cur->next = p_del->next;
		t_list->length--;
	}
	return res;
}

//链表的合并
void add_back(t_link_list *t_list,link_list_node *node)
{
	if(t_list != NULL && node != NULL) {
		link_list_node *p_cur = conv_node_type(t_list);
		int i;
		//每次循环到最后一个数据
		for(i = 0;i < get_len(t_list);i++) {
			p_cur = p_cur->next;
		}
		node->next = p_cur->next;
		p_cur->next = node;
		t_list->length++;
	}
}

//打印链表
void print_list(t_link_list *t_list) 
{
	link_list_node *p_cur = conv_node_type(t_list);
	while(p_cur->next != NULL) {
		p_cur = p_cur->next;
		printf("%p %d %p\n",p_cur,p_cur->data,p_cur->next);
	}
}

//链表合并排序
ivoid merge_list(t_link_list *p_res,t_link_list *t_list1,t_link_list *t_list2) 
{
	link_list_node *p1_head = conv_node_type(t_list1);
	link_list_node *p2_head = conv_node_type(t_list2);
	link_list_node *p1_cur = p1_head->next;
	link_list_node *p2_cur = p2_head->next;
	link_list_node *node = NULL;
	while(p1_cur != NULL || p2_cur != NULL) {
		//每次循环都要向新链表插入一个节点
		if(p1_cur != NULL && p2_cur != NULL) {
			node = (link_list_node*)malloc(sizeof(link_list_node));
			if(p1_cur->data <= p2_cur->data) {
				//分配一个空间,放值
				node->data = p1_cur->data;
				add_back(p_res,node);//这里node的地址,确定不会影响原数据移动
				p1_cur = p1_cur->next;
			} else {
				node->data = p2_cur->data;
				add_back(p_res,node);
				p2_cur = p2_cur->next;
			}	
		} else {
			if(p1_cur == NULL) {
				//把p2的值全部插完
				while(p2_cur != NULL) {
					node = (link_list_node*)malloc(sizeof(link_list_node));
					node->data = p2_cur->data;
					add_back(p_res,node);
					p2_cur = p2_cur->next;
				}
			} else {
				printf("p1_cur等于NULL\n");
				//p2_cur == NULL
				while(p1_cur != NULL) {
					node = (link_list_node*)malloc(sizeof(link_list_node));
					node->data = p1_cur->data;
					add_back(p_res,node);
					p1_cur = p1_cur->next;
				}
			}	
		}
	}
}

测试文件:main.c

#include <stdio.h>
#include <stdlib.h>
#include "linklist.h"

int main() {
	//创建两个链表1 3 5 7 9   2 4 6 8 10
	t_link_list *t_list1 = create_list();
	t_link_list *t_list2 = create_list();
	t_link_list *p_merge = create_list();
	//链表1创建数据
	link_list_node node1;
	link_list_node node2;
	link_list_node node3;
	link_list_node node4;
	link_list_node node5;
	
	//为链表1赋值
	node1.data = 1;
	node2.data = 3;
	node3.data = 5;
	node4.data = 7;
	node5.data = 9;

	add_back(t_list1,&node1);
	add_back(t_list1,&node2);
	add_back(t_list1,&node3);
	add_back(t_list1,&node4);
	add_back(t_list1,&node5);
	
	print_list(t_list1);

	//创建链表2
	link_list_node node6;
	link_list_node node7;
	link_list_node node8;
	link_list_node node9;
	link_list_node node10;
	
	//为链表1赋值
	node6.data = 2;
	node7.data = 4;
	node8.data = 6;
	node9.data = 8;
	node10.data = 10;

	add_back(t_list2,&node6);
	add_back(t_list2,&node7);
	add_back(t_list2,&node8);
	add_back(t_list2,&node9);
	add_back(t_list2,&node10);
	
	
	printf("\n-------\n");

	print_list(t_list2);

	//下面合并两张链表	
	merge_list(p_merge,t_list1,t_list2);

	printf("\n--------\n");

	print_list(p_merge);

	return 0;
}

Note:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值