基本的链表增删改查移步到上一篇:
https://blog.csdn.net/q466547450/article/details/89408637
视频讲解:https://www.bilibili.com/video/av52129100/
回顾:上篇写了链表的创建,删除,头插法,头删法,元素查询,链表输出等基本实现。尾插法和头插法不一样的地方在于需要循环遍历到尾部。
以下内容都是链表操作函数以及main函数里面的测试调用,main函数往上一篇找。
//链表逆序
void reverseLinkList(LinkNode& head){
LinkNode newhead=NULL;
LinkNode l=head->next;
if(createLinkList(newhead)){
while(l){
LinkNode lnext=l->next;
l->next=newhead->next;
newhead->next=l;
newhead->data++;
l=lnext;
}
}
free(head);
head=newhead;
}
//链表拼接,一条链表的尾端接上另一条链表的第一个数据域。
void joinLinkList(LinkNode ahead,LinkNode bhead,LinkNode& newhead){
createLinkList(newhead);
LinkNode h=ahead;
newhead->next=h->next;
while(h->next){
h=h->next;
}
h->next=bhead->next;
newhead->data=ahead->data+bhead->data;
}
以下提供两种链表排序方法,一种是插入排序,涉及到链表结点的插入,一种是选择排序,只操作链表的元素域。
//链表排序(插入排序)
void sortLinkListInset(LinkNode& head){
LinkNode l=head->next;
while(l->next){
LinkNode k=head;
while(k!=l){
if(l->next->data<=k->next->data){
LinkNode lnext=l->next;
l->next=lnext->next;
lnext->next=k->next;
k->next=lnext;
break;
}
k=k->next;
}
if(k==l){
l=l->next;
}
}
}
//链表排序(选择排序)
void sortLinkListSelect(LinkNode& head){
LinkNode l=head->next;
LinkNode k=NULL;
LinkNode min=NULL;
while(l){
k=l->next;
min=l;
while(k){
if(min->data>k->data){
min=k;
}
k=k->next;
}
Element temp=l->data;
l->data=min->data;
min->data=temp;
l=l->next;
}
}
//有序链表合并
void mergeLinkList(LinkNode ahead,LinkNode bhead,LinkNode& newhead){
createLinkList(newhead);
LinkNode la=ahead->next,lb=bhead->next,lc=newhead;
while(la&&lb){
if(la->data<lb->data){
lc->next=(LinkNode)malloc(sizeof(Lnode)); //这操作慎用。
lc=lc->next;
lc->data=la->data;
newhead->data++;
la=la->next;
}
else{
lc->next=(LinkNode)malloc(sizeof(Lnode));
lc=lc->next;
lc->data=lb->data;
newhead->data++;
lb=lb->next;
}
}
while(lb){
lc->next=(LinkNode)malloc(sizeof(Lnode));
lc=lc->next;
lc->data=lb->data;
newhead->data++;
lb=lb->next;
}
while(la){
lc->next=(LinkNode)malloc(sizeof(Lnode));
lc=lc->next;
lc->data=la->data;
newhead->data++;
la=la->next;
}
}
Main函数测试:
insertNode(lb,2);
insertNode(lb,13);
insertNode(lb,1);
insertNode(lb,16);
insertNode(lb,12);
//joinLinkList(head,lb,lc); //谨慎测试,因为lc这个链表只有头结点,其余下的结点都是参照前两条链表的
sortLinkListSelect(lb);
sortLinkListSelect(head);
mergeLinkList(head,lb,lc);
printLinkList(lc);
reverseLinkList(lc);
printLinkList(lc);