版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_30780133/article/details/82823424
2018/9/28 17:19 数据结构笔记(一)
数据结构中一种特别重要的结构就是链表,和链表有关的应用有很多,很多语言的容器api的底层实现就是链表,所以掌握链表也是一名计算机级专业的学生必备,下面我们就来看看一下单链表的小应用-----------将两个升序单链表,合并为一个降序单链表(不拆分升序链表),这里将会涉及的知识有:
1.单链表创建以及插入
2.头插法创建一个新链表
生成一个降序单链表很简单,只需要从第一个节点比较两个升序链表的元素,将较小的节点用头插法加入到新链表中。
头插法:
图示
所以只需要用头插法就能自动降序排列
代码实现
/**将两个升序单链表,合并为一个降序单链表
* @param list1 已升序的单链表头结点
* @param list2 已升序的单链表头结点
**/
void combineLinkedList(LinkedList * list1, LinkedList * list2){
LinkedList * list3 = (LinkedList*)malloc(sizeof(LinkedList));
Node * node1 = list1->next;
Node * node2 = list2->next;
list3->next = NULL;
while(node1 &&node2){
if(node1->element.id > node2->element.id){
//创建一个新节点
Node * node3 = (Node*)malloc(sizeof(Node));
node3->element = node2->element;
//使用头插法插入节点
node3->next = list3->next;
list3 ->next = node3;
node2 = node2->next;
list3->length++;
}else if(node1->element.id < node2->element.id){
Node * node3 = (Node*)malloc(sizeof(Node));
node3->element = node1->element;
node3->next = list3->next;
list3 ->next = node3;
node1 = node1->next;
list3->length++;
}else{
Node * node3 = (Node*)malloc(sizeof(Node));
node3->element = node2->element;
node3->next = list3->next;
list3->next = node3;
node1 = node1->next;
node2 = node2->next;
list3->length++;
}
}
//将剩余的节点也复制到新链表中
if(node1){
while(node1){
Node * node3 = (Node*)malloc(sizeof(Node));
node3->element = node1->element;
node3->next = list3->next;
list3 ->next = node3;
node1 = node1->next;
list3->length++;
}
}else if(node2){
while(node2){
Node * node3 = (Node*)malloc(sizeof(Node));
node3->element = node2->element;
node3->next = list3->next;
list3 ->next = node3;
node2 = node2->next;
list3->length++;
}
}
//打印单链表
printfLinkedList(list3);
}
这是所用的链表的数据结构代码
/**
定义链表的结点,包含数据域和指针域
**/
typedef struct Node{
ElemebtType element; //数据域
struct Node * next; //指针域
}Node;
/**
定义头结点,里面包含链表的长度
**/
typedef struct LinkedList{
Node * next;
int length;
}LinkedList;
/**
* 初始化链表
* @param linkedList 头结点
* @param
* @return
*/
void InitLinkedList(LinkedList * linkedList, ElemebtType * Array, int length);
/**
向链表中插入数据
**/
void insertLinkedlist(LinkedList * linkedlist, int pos, ElemebtType element);
/**
打印数据
**/
void printfLinkedList(LinkedList * Linkedlist);
/**
根据下标获取元素
**/
void getElement(LinkedList * Linkedlist, int index);
/**
根据下标删除某个元素
**/
ElemebtType DeleteLinkedElement(LinkedList * linkedList, int index);
/**在尾节点后添加一个元素**/
void addElement(LinkedList * linkedList, ElemebtType element);
第二种:合并后两个升序链表为降序链表--不生成新的节点
void combineNewLinkedList(LinkedList * list1, LinkedList * list2){
Node * node1 = list1->next;
Node * node2 = list2->next;
Node * node3;
//创建一个新链表,将list1设置为其头结点
LinkedList * list3 = list1;
list3->next = NULL;
while(node1 && node2){
if(node1->element.id > node2->element.id){
//直接赋值节点
node3 = node2;
node2 = node2->next;
list3->length++;
}else if(node1->element.id < node2->element.id){
node3 = node1;
node1 = node1->next;
list3->length++;
}else{
node3 = node1;
node1 = node1->next;
node2 = node2->next;
list3->length++;
}
//头插法
node3->next = list3->next;
list3->next = node3;
}
/**拼接剩余的节点**/
if(!node1){
node1 = node2;
}
while(node1){
node3 = node1;
node1 = node1->next;
node3->next = list3->next;
list3->next = node3;
list3->length++;
}
printfLinkedList(list3);
}