逆序打印单链表.
void LinkListReversePrint(LinkNode* head);
不允许遍历链表, 在 pos之前插入
void LinkListInsertBefore(LinkNode** head, LinkNode* pos, LinkType value);
LinkNode* JosephCycle(LinkNode* head, size_t food);
单链表逆置
void LinkListReverse(LinkNode** head);
void LinkListReverse2(LinkNode** head);
单链表的冒泡排序
void LinkListBubbleSort(LinkNode* head);
将两个有序链表, 合并成一个有序链表
LinkNode* LinkListMerge(LinkNode* head1, LinkNode* head2);
LinkNode* FindMidNode(LinkNode* head);
找到倒数第 K 个节点.
LinkNode* FindLastKNode(LinkNode* head, size_t K);
删除倒数第K个节点
void EraseLastKNode(LinkNode** head, size_t K);
判定单链表是否带环. 如果带环返回1
LinkNode* HasCycle(LinkNode* head);
如果链表带环, 求出环的入口
LinkNode* GetCycleEntry(LinkNode* head);
判定两个链表是否相交, 并求出交点
void LinkListReversePrint(LinkNode* head);
不允许遍历链表, 在 pos之前插入
void LinkListInsertBefore(LinkNode** head, LinkNode* pos, LinkType value);
LinkNode* JosephCycle(LinkNode* head, size_t food);
单链表逆置
void LinkListReverse(LinkNode** head);
void LinkListReverse2(LinkNode** head);
单链表的冒泡排序
void LinkListBubbleSort(LinkNode* head);
将两个有序链表, 合并成一个有序链表
LinkNode* LinkListMerge(LinkNode* head1, LinkNode* head2);
LinkNode* FindMidNode(LinkNode* head);
找到倒数第 K 个节点.
LinkNode* FindLastKNode(LinkNode* head, size_t K);
删除倒数第K个节点
void EraseLastKNode(LinkNode** head, size_t K);
判定单链表是否带环. 如果带环返回1
LinkNode* HasCycle(LinkNode* head);
如果链表带环, 求出环的长度
size_t GetCycleLen(LinkNode* head);如果链表带环, 求出环的入口
LinkNode* GetCycleEntry(LinkNode* head);
判定两个链表是否相交, 并求出交点
LinkNode* HasCross(LinkNode* head1, LinkNode* head2);
以下是头文件,承接上一个博客的功能
#pragma once
typedef char LinkNodeType;
typedef struct LinkNode{
LinkNodeType data;
struct LinkNode *next;
}LinkNode;
typedef struct LinkList{
LinkNode *head;
LinkNode *tail;
}LinkList;
typedef LinkNode *PLinkNode;
void PrintChar(LinkNode *head,const char *msg);
LinkNode* CreateNode(LinkNodeType value);
void LinkListInit(LinkNode** head);
void LinkListPushBack(LinkNode** head,LinkNodeType value);
void LinkListPopBack(LinkNode **head);
void DestoryNode(LinkNode *node);
void LinkListPushFront(LinkNode **head,LinkNodeType value);
void LinkListPopFront(LinkNode **head);
LinkNode* LinkListFind(LinkNode *head,LinkNodeType to_find);
void LinkListInsertBefore(LinkNode** head,LinkNode *pos,LinkNodeType value);
void LinkListErase(LinkNode **head,LinkNode *pos);
void LinkListErase2(LinkNode **head,LinkNode *pos);
void LinkListRemove(LinkNode **head,LinkNodeType to_delete);
void LinkListRemoveAll(LinkNode **head,LinkNodeType value);
int LinkListEmpty(LinkNode *head);
size_t LinkListSize(LinkNode *head);
void LinkListReversePrint(LinkNode *head);
void LinkListInsertBefore2(LinkNode **head,LinkNode *pos,LinkNodeType value);
LinkNode* JosephCycle(LinkNode *head,size_t food);
void LinkListReverse(LinkNode **head);
void LinkListReverse2(LinkNode **head);
void LinkListBubbleSort(LinkNode* head);
LinkNode* LinkListMerge(LinkNode *head1,LinkNode *head2);
LinkNode* FindMidNode(LinkNode *head);
LinkNode* FindLastKNode(LinkNode *head,size_t k);
void EraseLastKNode(LinkNode **head,size_t k);
int HasCycle(LinkNode* head);
size_t GetCycleLen(LinkNode *head);
LinkNode* MeetNode(LinkNode *head);
LinkNode* GetCycleEntry(LinkNode *head);
size_t HasCross(LinkNode *head1,LinkNode *head2);
再往下是功能实现:
#include<stdio.h>
#include"LinkList.h"
#include<stdlib.h>
#define TestHeader printf("\n=========%s========\n",__FUNCTION__)
void LinkListInit(LinkNode** head){
*head = NULL;
}
void PrintChar(LinkNode *head,const char *msg){
printf("[%s]\n",msg);
LinkNode *cur = head;//TODO
for(;cur !=NULL;cur=cur->next)
{
printf("[%c]|%p ",cur->data,cur);
}
printf("\n");
}
LinkNode* CreateNode(LinkNodeType value)
{
LinkNode *new_node=(LinkNode*)malloc(sizeof(LinkNode));
new_node->data=value;
new_node->next=NULL;
}
void DestoryNode(LinkNode *node){
free(node);
}
void LinkListPushBack(LinkNode **head,LinkNodeType value){
if(head==NULL){
return;
}
if(*head == NULL){
*head=CreateNode(value);
return;
}
LinkNode *cur=*head;
while(cur->next != NULL){
cur = cur->next;
}
LinkNode *new_node = CreateNode(value);
cur->next=new_node;
}
void LinkListPopBack(LinkNode **head){
if(head==NULL){
return;
}
if(*head==NULL){
return;
}
if((*head)->next == NULL){
DestoryNode(*head);
return;
}
LinkNode *cur=*head;
LinkNode *pre=NULL;
while(cur->next != NULL){
pre=cur;
cur=cur->next;
}
pre->next=NULL;
DestoryNode(cur);
return;
}
void LinkListPushFront(LinkNode **head,LinkNodeType value){
if(head==NULL){
return;
}
if(*head==NULL){//emptylist
LinkListPushBack(head,value);
}
LinkNode *new_node=CreateNode(value);
new_node->next=*head;
*head=new_node;
}
void LinkListPopFront(LinkNode **head){
if(head==NULL){
return;
}
if(*head==NULL){
return;
}
LinkNode *to_delete=*head;
*head=(*head)->next;
DestoryNode(to_delete);
}
LinkNode* LinkListFind(LinkNode *head,LinkNodeType to_find){
if(head==NULL){
return NULL;
}
LinkNode *cur=head;
while(cur->next != NULL){
if(cur->data == to_find){
break;
return NULL;
}
cur=cur->next;
}
return cur;
}
void LinkListInsertAfter(LinkNode **head,LinkNode *pos,LinkNodeType value){
if(*head==NULL){
return;
}
if(pos==NULL){
return;//inlegal input
}
LinkNode *new_node=CreateNode(value);
new_node->next=pos->next;
pos->next=new_node;
}
void LinkListInsertBefore(LinkNode **head,LinkNode *pos,LinkNodeType value){
if(*head == NULL){
return;
}
if(pos == NULL){
return;
}
if(*head == pos){
LinkListPushFront(head,value);
return;
}
LinkNode *cur=*head;
for(;cur->next != NULL;cur = cur->next){
if(cur == pos){
break;
}
if(cur == NULL){
return;
}//pos not in list
}
LinkListInsertAfter(head,cur,value);
return;
}
void LinkListErase(LinkNode **head,LinkNode *pos){
if(*head == NULL || pos==NULL){
return;
}
if(head == NULL){
return;
}
LinkNode *cur = *head;
LinkNode *pre =NULL;
LinkNode *to_erase = NULL;
for(;cur!= NULL;pre = cur,cur= cur->next){
if(cur == pos){
break;
}
if(cur == NULL){
return;
}
}
to_erase=cur;
pre->next=to_erase->next;;
DestoryNode(to_erase);
return;
}
void LinkListErase2(LinkNode **head,LinkNode *pos){
if(pos==NULL || head==NULL){
return;
}
if(*head== NULL){
return;
}
if(pos->next == NULL){
LinkListErase(head,pos);
return;
}
pos->data=pos->next->data;
LinkNode *to_erase = pos->next;
pos->next=to_erase->next;
DestoryNode(to_erase);
return;
}
void LinkListRemove(LinkNode **head,LinkNodeType to_delete){
if(head==NULL){
return;
}
if(*head == NULL){
return;
}
if((*head)->data == to_delete){
LinkNode *to_delete = *head;
(*head)=(*head)->next;
DestoryNode(to_delete);
return;
}
LinkNode *cur = *head;
for(;cur->next!=NULL;cur=cur->next){
if(cur->data == to_delete){
LinkNode *to_delete=cur;
cur->next=to_delete->next;
DestoryNode(to_delete);
return;
}
}
return;
}
void LinkListRemoveAll(LinkNode **head,LinkNodeType value){
if(head == NULL){
return;
}
if(*head == NULL){
return;
}
LinkNode *cur = *head;
for(;cur->next!=NULL;cur=cur->next){
if(cur->data == value){
LinkListRemove(head,value);
}
}
return;
}
int LinkListEmpty(LinkNode *head){
return head==NULL?1:0;
}
size_t LinkListSize(LinkNode *head){
if(head == NULL){
return 0;
}
size_t count=1;
LinkNode *cur=head;
for(;cur->next != NULL;cur= cur->next){
count++;
}
return count;
}
void LinkListReversePrint(LinkNode *head){
if(head == NULL){
return;
}
LinkListReversePrint(head->next);
printf("[%c]%p",head->data,head);
}
void LinkListInsertBefore2(LinkNode **head,LinkNode *pos,LinkNodeType value){
if(*head == NULL || pos == NULL){
return;
}
LinkNode *new_node=CreateNode(pos->data);
LinkNode *after_new_node=pos->next;
pos->next=new_node;
new_node->next=after_new_node;
pos->data=value;
return;
}
LinkNode* JosephCycle(LinkNode *head,size_t food){
if(head == NULL){
return;
}
if(head->next == head ){
return;
}
LinkNode *cur =head;
while(cur->next != cur){
int i=1;
for(;i<food;++i){
cur=cur->next;
}
printf("%c\n",cur->data);
cur->data=cur->next->data;
LinkNode *to_delete=cur->next;
cur->next=to_delete->next;
DestoryNode(to_delete);
}
return cur;
}
void LinkListReverse(LinkNode **head){
if(*head == NULL){
return;
}
if(head == NULL){
return;
}
if((*head)->next == NULL){
return;
}
LinkNode *pre=*head;
LinkNode *cur=pre->next;
pre->next=NULL;
while(cur != NULL){
LinkNode *next =cur->next;
cur->next=pre;
pre=cur;
cur=next;
}
*head=pre;
return;
}
void LinkListReverse2(LinkNode **head){
if(*head == NULL){
return;
}
if(head == NULL){
return;
}
if((*head)->next == NULL){
return;
}
LinkNode *cur=*head;
while(cur->next!=NULL){
LinkNode *to_move=cur->next;
cur->next=to_move->next;
to_move->next=*head;
*head=to_move;
}
return;
}
void LinkListBubbleSort(LinkNode *head){
if (head == NULL){
return;
}
if(head->next == NULL){
return;
}
LinkNode *count=head;
LinkNode *tail=NULL;
for(;count!=NULL;count=count->next){
LinkNode *cur=head;
for(;cur->next !=tail;cur=cur->next){
if((cur->data) > (cur->next->data)){
int tmp=cur->next->data;
cur->next->data=cur->data;
cur->data=tmp;
}
}
tail=cur;
}
return;
}
LinkNode* LinkListMerge(LinkNode *head1,LinkNode *head2){
if(head1 == NULL){return head2;}
if(head2 == NULL){return head1;}
LinkNode *cur1=head1;
LinkNode *cur2=head2;
LinkNode *new_head=NULL;
LinkNode *new_tail=NULL;
while(cur1!=NULL && cur2!=NULL){
if(cur1->data < cur2->data){
if(new_tail==NULL){
new_head=cur1;
new_tail=cur1;
cur1=cur1->next;
}
else{
new_tail->next=cur1;
new_tail=new_tail->next;
cur1=cur1->next;
}
}
else{
if(new_tail==NULL){
new_head=cur2;
new_tail=cur2;
cur2=cur2->next;
}
else{
new_tail->next=cur2;
new_tail=new_tail->next;
cur2=cur2->next;
}
}
}
if(cur1 !=NULL){
new_tail->next=cur1;
}
else{
new_tail->next=cur2;
}
return new_head;
}
LinkNode* FindMidNode(LinkNode *head){
if(head == NULL){
return;
}
LinkNode *slow=head;
LinkNode *fast=head;
while(fast != NULL && fast->next !=NULL){
slow=slow->next;
fast=fast->next->next;
}
return slow;
}
LinkNode* FindLastKNode(LinkNode *head,size_t k){
if(head == NULL){
return;
}
LinkNode *fast=head;
LinkNode *slow=head;
int i=0;
for(;i<k;++i){
if(fast==NULL){
break;
}
fast=fast->next;
}
if(i!=k){
return NULL;
}
while(fast!=NULL){
fast=fast->next;
slow=slow->next;
}
return slow;
}
void EraseLastKNode(LinkNode **head,size_t k){
if(*head == NULL){
return;
}
if(head==NULL){
return;
}
size_t len=LinkListSize(*head);
if(k==len){
LinkListPopFront(head);
return;
}
LinkNode *pre=*head;
int i=0;
for(;i<len-1-k;++i){
pre=pre->next;
}
LinkNode *to_delete=pre->next;
pre->next=to_delete->next;
DestoryNode(to_delete);
return;
}
int HasCycle(LinkNode* head){
if(head == NULL){
return;
}
LinkNode *slow=head;
LinkNode *fast=head;
while(fast!= NULL && fast->next != NULL){
fast=fast->next->next;
slow=slow->next;
if(slow == fast ){
return 1;
}
}
return 0;
}
LinkNode *MeetNode(LinkNode* head){
if(head == NULL){
return;
}
LinkNode *slow=head;
LinkNode *fast=head;
while(fast!= NULL && fast->next != NULL){
fast=fast->next->next;
slow=slow->next;
if(slow == fast ){
return slow;
}
}
return NULL;
}
size_t GetCycleLen(LinkNode *head){
if(head == NULL){
return 0;
}
LinkNode *meet_node=MeetNode(head);
if(meet_node == NULL){
return 0;
}
size_t count=0;
LinkNode *cur=meet_node->next;
while(cur!=meet_node){
cur=cur->next;
count++;
}
return count;
}
void TestGetCycleLen(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'1');
LinkListPushBack(&head,'2');
LinkListPushBack(&head,'3');
LinkListPushBack(&head,'4');
LinkListPushBack(&head,'5');
LinkNode *pos_end=LinkListFind(head,'5');
pos_end->next=head->next->next;
int ret=GetCycleLen(head);
printf("the len is %d\n",ret);
}
LinkNode* GetCycleEntry(LinkNode *head){
if(head==NULL){
return NULL;
}
int judge;
judge=HasCycle(head);
if(judge != 1){
return NULL;
}
LinkNode *meet_node=MeetNode(head);
LinkNode *fast=meet_node;
LinkNode *slow=head;
while(slow != fast){
slow=slow->next;
fast=fast->next;
}
return slow;
}
void TestGetCycleEntry(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'1');
LinkListPushBack(&head,'2');
LinkListPushBack(&head,'3');
LinkListPushBack(&head,'4');
LinkListPushBack(&head,'5');
LinkNode *pos_end=LinkListFind(head,'5');
pos_end->next=head->next->next;
LinkNode *entry=GetCycleEntry(head);
printf("[%c]|%p",entry->data,entry);
}
LinkNode* HasCross(LinkNode *head1,LinkNode *head2){
if(head1 == NULL || head2 ==NULL){
return 0;
}
LinkNode *cur1=head1;
LinkNode *cur2=head2;
while(1){
if(cur1->data == cur2->data){
break;
}
cur1=cur1->next;
cur2=cur2->next;
if(cur1== NULL || cur2== NULL ){
return NULL;
}
}
return cur1;
}
void TestHasCross(){
TestHeader;
LinkNode *head1;
LinkListInit(&head1);
LinkListPushBack(&head1,'1');
LinkListPushBack(&head1,'2');
LinkListPushBack(&head1,'3');
LinkListPushBack(&head1,'7');
LinkListPushBack(&head1,'8');
LinkNode *head2;
LinkListInit(&head2);
LinkListPushBack(&head2,'4');
LinkListPushBack(&head2,'5');
LinkListPushBack(&head2,'6');
LinkListPushBack(&head2,'7');
LinkListPushBack(&head2,'8');
LinkNode *cross=HasCross(head1,head2);
printf("[%c]|%p\n",cross->data,cross);
}
void TestHasCycle(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'1');
LinkListPushBack(&head,'2');
LinkListPushBack(&head,'3');
LinkListPushBack(&head,'4');
LinkListPushBack(&head,'5');
LinkNode *pos_end=LinkListFind(head,'5');
pos_end->next=head;
int i=HasCycle(head);
printf("%d\n",i);
}
void TestEraseLastKNode(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'1');
LinkListPushBack(&head,'2');
LinkListPushBack(&head,'3');
LinkListPushBack(&head,'4');
LinkListPushBack(&head,'5');
EraseLastKNode(&head,2);
PrintChar(head,"\n");
}
void TestLastKNode(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'1');
LinkListPushBack(&head,'2');
LinkListPushBack(&head,'3');
LinkListPushBack(&head,'4');
LinkListPushBack(&head,'5');
LinkNode *LastKNode=FindLastKNode(head,1);
printf("[%c]|%p\n",LastKNode->data,LastKNode);
}
void TestMidNode(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'1');
LinkListPushBack(&head,'3');
LinkListPushBack(&head,'5');
LinkListPushBack(&head,'7');
LinkNode *mid_node=FindMidNode(head);
printf("[%c]|%p",mid_node->data,mid_node);
}
void TestMerge(){
TestHeader;
LinkNode *head1;
LinkListInit(&head1);
LinkListPushBack(&head1,'1');
LinkListPushBack(&head1,'3');
LinkListPushBack(&head1,'5');
LinkListPushBack(&head1,'7');
LinkNode *head2;
LinkListInit(&head2);
LinkListPushBack(&head2,'2');
LinkListPushBack(&head2,'4');
LinkListPushBack(&head2,'6');
LinkListPushBack(&head2,'8');
LinkNode *new_list=LinkListMerge(head1,head2);
PrintChar(new_list,"\n");
}
void TestBubbleSort(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'1');
LinkListPushBack(&head,'2');
LinkListPushBack(&head,'4');
LinkListPushBack(&head,'3');
LinkListBubbleSort(head);
PrintChar(head,"\n");
}
void TestReverse2(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkListReverse2(&head);
PrintChar(head,"\n");
}
void TestReverse(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkListReverse(&head);
PrintChar(head,"\n");
}
void TestJosephCycle(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkNode *a=CreateNode('a');
LinkNode *b=CreateNode('b');
LinkNode *c=CreateNode('c');
LinkNode *d=CreateNode('d');
head=a;
a->next=b;
b->next=c;
c->next=d;
d->next=a;
LinkNode *ret=JosephCycle(head,2);
printf("%p",ret);
}
void TestInsertBefore2(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkNode *pos=head->next->next->next;
LinkListInsertBefore2(&head,pos,'x');
PrintChar(head,"\n");
}
void TestReversePrint(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkListReversePrint(head);
printf("\n");
}
void TestSize(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'d');
int len=LinkListSize(head);
printf("the size is %d\n",len);
}
void TestEmpty(){
TestHeader;
LinkNode *head;
int ret=LinkListEmpty(head);
printf("result is :%d\n",ret);
}
void TestRemoveAll(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'d');
LinkListRemoveAll(&head,'a');
PrintChar(head,"\n");
}
void TestRemove(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkListRemove(&head,'b');
PrintChar(head,"\n");
}
void TestErase2(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkNode *pos = head->next->next;
LinkListErase2(&head,pos);
PrintChar(head,"\n");
}
void TestErase(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkNode *pos = head->next->next;
LinkListErase(&head,pos);
PrintChar(head,"\n");
}
void TestInsertBefore(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkNode *pos=head->next;
LinkListInsertBefore(&head,pos,'H');
PrintChar(head,"\n");
}
void TestInsertAfter(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkNode *pos=head->next;
LinkListInsertAfter(&head,pos,'o');
PrintChar(head,"\n");
}
void TestFind(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkNode *dest=LinkListFind(head,'c');
PrintChar(head,"\n");
printf("the address of c is[%p]\n",dest);
}
void TestPopFront(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkListPopFront(&head);
LinkListPopFront(&head);
PrintChar(head,"\n");
}
void TestPushFront(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkListPushFront(&head,'x');
LinkListPushFront(&head,'y');
PrintChar(head,"\n");
}
void TestPopBack(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
LinkListPopBack(&head);
LinkListPopBack(&head);
PrintChar(head,"\n");
}
void TestPushBack(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
LinkListPushBack(&head,'a');
LinkListPushBack(&head,'b');
LinkListPushBack(&head,'c');
LinkListPushBack(&head,'d');
PrintChar(head,"\n");
}
void TestInit(){
TestHeader;
LinkNode *head;
LinkListInit(&head);
}
void main(){
TestInit();
TestPushBack();
TestPopBack();
TestPushFront();
TestPopFront();
TestFind();
TestInsertAfter();
TestErase();
TestErase2();
TestRemove();
TestRemoveAll();
TestEmpty();
TestSize();
TestReversePrint();
TestInsertBefore2();
TestJosephCycle();
TestReverse();
TestReverse2();
TestBubbleSort();
TestMerge();
TestMidNode();
TestLastKNode();
TestEraseLastKNode();
TestHasCycle();
TestGetCycleLen();
TestGetCycleEntry();
TestHasCross();
}