链表的部分操作(1)

本次代码是关于链表的部分操作:
#include<stdio.h>
#include<stdlib.h>


#define __NAME__ printf("\n--------%s----------\n",__FUNCTION__)
typedef char LinkType;
typedef struct LinkNode{
LinkType data;
struct LinkNode* next;
}LinkNode;
//结点的删除
void Destroy(LinkNode* Erase){
free(Erase);
}
//删除链表尾结点
LinkNode* LinkListPopBack(LinkNode** head){
LinkNode * ret = NULL;
if(head == NULL){
return ret;
}
if((*head)->next ==NULL){
return ret;
}
LinkNode * cur = (*head);
LinkNode* p = cur;
while(cur->next != NULL){
p = cur;
cur = cur->next;
}
ret = cur;
p->next = NULL;
return ret;
}
//对链表进行头插
void LinkListPushFront(LinkNode** head,LinkNode* ret){
if(head == NULL){
return;
}
ret->next = (*head)->next;
(*head)->next = ret;
}
//创建新结点
LinkNode* CreateNewNode(LinkType value){
LinkNode * New_Node = (LinkNode*)malloc(sizeof(LinkNode));
New_Node->data = value;
New_Node->next = NULL;
return New_Node;
}


//打印链表
void printfList(LinkNode* head){
while(head->next!=NULL){
printf("%c|%p ",head->next->data,head->next);
head = head->next;
}
printf("\n");
return;
}
//将链表逆序打印
void LinkListReversePrint(LinkNode* head){
//LinkNode * cur = head->next;
//LinkNode * ret = NULL;
//while(cur != ret){
//    ret = LinkListPopBack(&head);
// LinkListPushFront(&head,ret);
//}
//printfList(head);
//return;
if (head->next == NULL){
return;
}
LinkNode * cur = head->next;
LinkNode * p = NULL;
LinkNode * q = NULL;
if(cur != NULL && cur->next != NULL){
p = cur->next;
q = cur->next->next;
p->next = cur;
cur->next = NULL;
cur = p;
p = q;
}
while(p!=NULL){
q = p->next;
p->next = cur;
cur = p;
p = q;
}
head->next = cur;
printfList(head);
}




//LInkNode* LinkNodeFind(LinkNode* head,LinkType value){
// if(head->next == NULL){
// return NULL;
// }
// LinkNode* ret = head->next;
// while(cur != NULL ){
// if(cur->data == value){
// return ret;
// }
// cur = cur->next;
// }
//}
//对链表进行指定位置之后插入新结点
void LinkListInsertAfter(LinkNode** head,LinkNode* pos,LinkType value){
LinkNode* cur = CreateNewNode(value);
cur->next = pos->next;
pos->next = cur;
}
//对链表进行指定位置之前插入结点
void LinkListInsertBefore(LinkNode** head,LinkNode* pos,LinkType value){
if(head == NULL){
return;
}
if((*head)->next==NULL){
return;
}
// LinkNode* ret = LinkNodeFind(*head,value);
LinkListInsertAfter(head,pos,pos->data);
pos->data = value;
}
//对链表进行冒泡排序
void LinkListBubbleSort(LinkNode* head){
LinkNode* p =head->next;
size_t count = 0;
for(;p != NULL;p =p->next){
count++;
}
if(count == 0){
return;
}
size_t num = 1;
for(;num<count;num++){
LinkNode* cur = head->next;
for(;cur->next!=NULL; cur = cur->next){
if(cur->data > cur->next->data){
LinkType tmp = cur->data;
cur->data = cur->next->data;
cur->next->data = tmp;
}
}
}
}
//将俩个有序链表合并成一个有序链表
LinkNode* LinkListMerge(LinkNode* head1,LinkNode* head2){
LinkNode* head =(LinkNode*)malloc(sizeof(LinkNode));
LinkNode* p = head1->next;
LinkNode* q = head2->next;
LinkNode* cur = head;
LinkNode* ret1 =p;
LinkNode* ret2 =q;
while(p!=NULL &&q!= NULL){
if(p->data > q->data){
ret2 = q;
LinkNode* ret = CreateNewNode(q->data);
ret->next = cur->next;
cur->next = ret;
q = q->next;
cur = ret;
}
else{
ret1 = p;
LinkNode* ret = CreateNewNode(p->data);
ret->next = cur->next;
cur->next = ret;
p = p->next;
cur = ret;
}
}
if(p == NULL){
cur->next = q;
}
else{
cur->next = p;
}
return head;
}
//求链表中间结点
LinkNode* LinkListMidNode(LinkNode* head){
LinkNode* fast = head;
LinkNode* slow = head;
while(fast != NULL&&fast->next != NULL){
fast = fast->next->next;
slow = slow->next;
}
return slow;
}
//查找链表倒数第K个结点
LinkNode* FindLastKNode(LinkNode* head,size_t K){
LinkNode* first = head->next;
LinkNode* last = head->next;
size_t i = K-1;
while(i > 0){
if(first != NULL){
first = first->next;
}
--i;
}
if(i==0){
while(first->next != NULL){
first = first->next;
last = last->next;
}
return last;
}
return NULL;
}
//删除链表倒数第k个结点
void EraseLastKNode(LinkNode** head,size_t K){
if(head == NULL){
return;
}
if(K>0){
LinkNode* ret = FindLastKNode(*head,K+1);
if(ret != NULL){
LinkNode* Erase = ret->next;
ret->next = ret->next->next;
Destroy(Erase);
}
else{
return;
}
}
return;
}
//判断链表是否有环
LinkNode* HasCycle(LinkNode* head){
if(head->next == NULL){
return NULL;
}
LinkNode* fast = head->next->next;
LinkNode* slow = head->next;
while(fast != NULL&&fast->next != NULL){
fast =fast->next->next;
slow = slow->next;
if(fast == slow){
return fast;
}
}
return NULL;
}
//求带环链表环的长度
size_t GetCycleLen(LinkNode* head){
LinkNode* ret = HasCycle(head);
if(ret == NULL){
return 0;
}
size_t count = 0;
LinkNode* cur = ret;
while(cur->next != ret){
++count;
cur = cur->next;
}
return count;
}
//求带环链表环的入口结点
LinkNode* GetCycleEntry(LinkNode* head){
LinkNode* ret = HasCycle(head);
if(ret ==NULL){
return NULL;
}
LinkNode* cur = head;
while(cur != ret){
cur = cur->next;
ret = ret->next;
}
return ret;
}
//判断俩个链表是否有交集
LinkNode* HasCross(LinkNode* head1,LinkNode* head2){
if(head1->next == NULL &&head2->next == NULL){
return NULL;
}
LinkNode* cur1 = head1->next;
LinkNode* cur2 = head2->next;
for(;cur1!= NULL;cur1 = cur1->next){
for(cur2=head2->next;cur2!=NULL;cur2 = cur2->next){
if(cur1->data == cur2->data){
return cur1;
}
}
}
return NULL;
}
//以下为各个函数的检查代码
textHasCross(){
LinkNode* head1 = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head1,CreateNewNode('a'));
LinkListPushFront(&head1,CreateNewNode('b'));
LinkListPushFront(&head1,CreateNewNode('x'));
LinkListPushFront(&head1,CreateNewNode('y'));
LinkNode* head2 = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head2,CreateNewNode('a'));
LinkListPushFront(&head2,CreateNewNode('b'));
LinkListPushFront(&head2,CreateNewNode('c'));
LinkListPushFront(&head2,CreateNewNode('d'));
LinkNode* ret = HasCross(head1,head2);
printf("\n******HAS CROSS********\n");
printf("expect 1\n");
if(ret != NULL){
printf("1\n");
return;
}
printf("NO CROSS\n");
return;
}


textGetCycleEntry(){
LinkNode* head = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head,CreateNewNode('a'));
LinkListPushFront(&head,CreateNewNode('b'));
LinkListPushFront(&head,CreateNewNode('c'));
LinkListPushFront(&head,CreateNewNode('d'));
head->next->next->next->next->next = head->next->next->next;
LinkNode* ret =GetCycleEntry(head);
printf("\n******GET CYCLE ENTRY**********\n");
printf("expect b\n");
if(ret == NULL){
printf("NOT FIND\n");
return;
}
printf("%c\n",ret->data);


}


textGetCycleLen(){
LinkNode* head = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head,CreateNewNode('a'));
LinkListPushFront(&head,CreateNewNode('b'));
LinkListPushFront(&head,CreateNewNode('c'));
LinkListPushFront(&head,CreateNewNode('d'));
head->next->next->next->next->next = head->next->next->next;
size_t num = GetCycleLen(head);
printf("\n*****Get Cycle Len***********\n");
printf("expect 1 ");
printf("%d \n",num);


}


textHasCycle(){
LinkNode* head = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head,CreateNewNode('a'));
LinkListPushFront(&head,CreateNewNode('b'));
LinkListPushFront(&head,CreateNewNode('c'));
LinkListPushFront(&head,CreateNewNode('d'));
head->next->next->next->next->next = head->next->next->next;
LinkNode* ret = HasCycle(head);
printf("\n*****HAS CYCLE***********\n");
printf("%c\n ",ret->data);
printf("expect 1 ");
if(ret = NULL){
printf("0 \n");
}
else{
printf("1 ");
}
}


textEraseLastKNode(){
LinkNode* head = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head,CreateNewNode('a'));
LinkListPushFront(&head,CreateNewNode('b'));
LinkListPushFront(&head,CreateNewNode('c'));
LinkListPushFront(&head,CreateNewNode('d'));
EraseLastKNode(&head,2);
printf("\n*****ERASE LAST K NODE***********\n");
printfList(head);


}


textFindLastKNode(){
LinkNode* head = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head,CreateNewNode('a'));
LinkListPushFront(&head,CreateNewNode('b'));
LinkListPushFront(&head,CreateNewNode('c'));
LinkListPushFront(&head,CreateNewNode('d'));
    LinkNode* ret = FindLastKNode(head,2);
printf("\n*****FIND LAST K NODE***********\n");
if(ret != NULL){
printf("%c \n",ret->data);
return;
}
printf("NOT FIND\n");
return;




}
textMidNode(){
LinkNode* head = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head,CreateNewNode('a'));
LinkListPushFront(&head,CreateNewNode('b'));
LinkListPushFront(&head,CreateNewNode('c'));
LinkListPushFront(&head,CreateNewNode('d'));
LinkNode* ret = LinkListMidNode(head);
printf("\n*****MidNode***********\n");
printf("%c \n",ret->data);
}


textReversePrint(){
LinkNode* head = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head,CreateNewNode('a'));
LinkListPushFront(&head,CreateNewNode('b'));
LinkListPushFront(&head,CreateNewNode('c'));
LinkListPushFront(&head,CreateNewNode('d'));
LinkListPopBack(&head);
printf("\n****************\n");
printfList(head);
printf("\n****************\n");
LinkListReversePrint(head);
}


textInsertBefore(){
LinkNode* head = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head,CreateNewNode('a'));
LinkListPushFront(&head,CreateNewNode('b'));
LinkListPushFront(&head,CreateNewNode('c'));
LinkListPushFront(&head,CreateNewNode('d'));
LinkListInsertBefore(&head,head->next->next,'x');
printf("\n*******InsertBefore*********\n");
printfList(head);
}
textBubblesort(){
LinkNode* head = (LinkNode *)malloc(sizeof(LinkNode));
LinkListPushFront(&head,CreateNewNode('a'));
LinkListPushFront(&head,CreateNewNode('b'));
LinkListPushFront(&head,CreateNewNode('c'));
LinkListPushFront(&head,CreateNewNode('d'));
LinkListBubbleSort(head);
printfList(head);
}


textLinkListMerge(){
LinkNode* head1 =(LinkNode*)malloc(sizeof(LinkNode));
LinkNode* head2 =(LinkNode*)malloc(sizeof(LinkNode));
LinkListPushFront(&head1,CreateNewNode('h'));
LinkListPushFront(&head1,CreateNewNode('e'));
LinkListPushFront(&head1,CreateNewNode('c'));
LinkListPushFront(&head1,CreateNewNode('a'));
LinkListPushFront(&head2,CreateNewNode('g'));
LinkListPushFront(&head2,CreateNewNode('f'));
LinkListPushFront(&head2,CreateNewNode('d'));
LinkListPushFront(&head2,CreateNewNode('b'));
LinkNode* head = LinkListMerge(head1,head2);
printf("\n*********head1********\n");
printfList(head1);
printf("\n**********head2*******\n");
printfList(head2);
printf("\n**********head*******\n");
printfList(head);


}
//以下为链表部分程序的主函数
int main(){
textReversePrint();
textInsertBefore();
textBubblesort();
textLinkListMerge();
textMidNode();
textFindLastKNode();
textEraseLastKNode();
textHasCycle();
textGetCycleLen();
textGetCycleEntry();
textHasCross();

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值