数据结构 链表

程序代码:

LinkList.h文件:
//防止重定义,与下面#endif对应
#ifndef __LINKLIST_H__
#define __LINKLIST_H__
//整个工程所需要的头文件
#include <stdio.h>
#include <Windows.h>
#include <stdlib.h>
#include <assert.h>
typedef int DataType;//类型重命名,为了方便修改顺序表中元素的类型,在这改一次就可以,不用每个地方都修改

typedef struct Node
{
    DataType data;
    struct Node* next;
}Node, *pNode, List, *pList;//结构体定义
//单链表能实现的功能

//创建一个节点
pNode BuyNode(DataType d);
//初始化链表
void InitLinkList(pList* pplist);
//销毁链表
void DestroyLinkList(pList* pplist);
//打印链表
void PrintLinkList(pList plist);
//尾部插入元素
void PushBack(pList* pplist, DataType d);
//尾部删除元素
void PopBack(pList* pplist);
//头部插入元素
void PushFront(pList* pplist, DataType d);
//头部删除元素
void PopFront(pList *pplist);
//查找元素
pNode Find(pList plist, DataType d);
//在指定位置之前插入一个值
void Insert(pList* pplist, pNode pos, DataType d);
//删除指定位置的元素
void Erase(pList* pplist, pNode pos);
//删除指定元素
void Remove(pList* pplist, DataType d);
//删除所有指定元素
void RemoveAll(pList* pplist, DataType d);
//链表长度
int GetListLength(pList plist);

//链表面试题:
//1.从尾到头打印单项链表
void PrintTailToHead_R(pList plist);
void PrintTailToHead(pList plist);
//2.删除一个无头单项链表的非尾节点(不能遍历链表)
void EraseNotTailNode(pNode pos);
//3.在无头单项链表的一个节点前插入一个节点(不能遍历链表)
void InsertNotTailNode(pNode pos, DataType d);
//4.单链表实现约瑟夫环(JosephCircle)
pNode JosephCircle(pNode plist, const int M);
//5.逆置/反转单链表
void ReverseList(pList *pplist);//三个指针
pNode ReverseList_PF(pList plist);//头插法
//6.单链表排序(冒泡排序&快速排序)
void BubbleSort(pNode* pplist);
//7.合并两个有序链表,合并后依然有序
pNode MergeOrderList(pList plist1, pList plist2);
//8.查找单链表的中间节点,要求只能遍历一次链表
pNode FindMiddleNode(pNode plist);
//9.查找单链表的倒数第K个节点,要求只能遍历一次链表
pNode FindInverseKNode(pNode plist, const int K);
//10.删除链表的倒数第K个节点
void DeleteInverseKNode(pNode* pplist, const int K);
//11.判断单链表是否带环?若带环,求环的长度?求环的入口?
pNode IsListCircle(pNode plist);
int ListCiecleLen(pNode meet);
pNode ListCircleEnter(pNode plist, pNode meet);
//  并计算每个算法的时间复杂度&空间复杂度

//12.判断两个链表是否相交,若相交,求交点(假设链表不带环)
int IsListCross(pNode plist1, pNode plist2);
pNode ListCrossPoint(pNode plist1, pNode plist2);
//13.判断两个链表是否相交,若相交,求交点(假设链表可能带环)【升级版】
int IsListCross_C(pNode plist1, pNode plist2);
pNode ListCrossPoint_C(pNode plist1, pNode plist2);
//14.复杂链表的复制。(复杂链表:一个链表的每个节点,有一个指向next指针指向的下一个节点,
//  还有一个random指针指向这个链表中的一个随机节点或者NULL)现在要求实现复制
//  这个链表,返回复制后的新链表
pNode CopyComplexList(pNode plist);
//15.求两个已排序单链表中相同的数据。
void UnionSet(pNode l1, pNode l2);
//与最前面#ifndef相对应
#endif //__LINKLIST_H__
LinkList.c文件(对前面用到的所有函数进行定义)
//头文件
#define _CRT_SECURE_NO_WARNINGS 1

#include "LinkList.h"
//创建节点
pNode BuyNode(DataType d)
{
    pNode node = malloc(sizeof(Node));
    node->data = d;
    node->next = NULL;
    return node;
}
//初始化链表
void InitLinkList(pList* pplist)
{
    assert(pplist);

    *pplist = NULL;
}
//摧毁链表
void DestroyLinkList(pList* pplist)
{
    assert(pplist);

    pNode cur = *pplist;
    pNode del = cur;

    while (cur)
    {
        del = cur;
        cur = cur->next;
        free(del);
        del = NULL;
    }

    *pplist = NULL;
}
//打印链表
void PrintLinkList(pList plist)
{
    pNode temp = plist;

    while (temp)
    {
        printf("%d-->", temp->data);
        temp = temp->next;
    }
    printf("NULL\n");
}
//尾部插入元素
void PushBack(pList* pplist, DataType d)
{
    assert(pplist);

    pNode NewNode = BuyNode(d);

    if (*pplist == NULL)
    {
        *pplist = NewNode;
    }
    else
    {
        pNode cur = *pplist;

        while (cur->next)
        {
            cur = cur->next;
        }

        cur->next = NewNode;
    }
}
//尾部删除元素
void PopBack(pList* pplist)
{
    assert(pplist);

    if (*pplist == NULL)
    {
        return;
    }

    if ((*pplist)->next == NULL)
    {
        free(*pplist);
        *pplist = NULL;
        return;
    }

    pNode cur = *pplist;

    while (cur->next->next != NULL)
    {
        cur = cur->next;
    }
    free(cur->next);
    cur->next = NULL;
}
//头部插入元素
void PushFront(pList* pplist, DataType d)
{
    assert(pplist);

    pNode NewNode = BuyNode(d);

    NewNode->next = *pplist;
    *pplist = NewNode;
}
//头部删除元素
void PopFront(pList *pplist)
{
    assert(pplist);

    if (*pplist == NULL)
    {
        return;
    }

    pNode del = *pplist;
    *pplist = del->next;
    free(del);
    del = NULL;
}
//查找元素
pNode Find(pList plist, DataType d)
{
    pNode cur = plist;

    while (cur && (cur->data != d))
    {
        cur = cur->next;
    }

    if (cur != NULL)
    {
        return cur;
    }
}
//在指定位置之前插入元素
void Insert(pList* pplist, pNode pos, DataType d)
{
    assert(pplist);
    assert(pos);
    if (*pplist == NULL)
    {
        return;
    }

    if (*pplist == pos)
    {
        PushFront(pplist, d);
    }

    pNode cur = *pplist;
    pNode NewNode = BuyNode(d);

    while (cur && (cur->next != pos))
    {
        cur = cur->next;
    }

    if (cur != NULL)
    {
        cur->next = NewNode;
        NewNode->next = pos;
    }
}
//删除指定位置元素
void Erase(pList* pplist, pNode pos)
{
    assert(pplist);
    assert(pos);
    if (*pplist == NULL)
    {
        return;
    }

    if (*pplist == pos)
    {
        PopFront(&pplist);
    }

    pNode cur = *pplist;
    while (cur && (cur->next != pos))
    {
        cur = cur->next;
    }

    if (cur != NULL)
    {
        cur->next = pos->next;
        free(pos);
        pos = NULL;
    }

}
//删除指定元素
void Remove(pList* pplist, DataType d)
{
    assert(pplist);

    if (*pplist == NULL)
    {
        return;
    }

    if ((*pplist)->data == d)
    {
        PopFront(pplist);
    }
    else
    {
        pNode cur = *pplist;
        pNode temp = NULL;

        while (cur && (cur->data != d))
        {
            temp = cur;
            cur = cur->next;
        }

        if (cur != NULL)
        {
            temp->next = cur->next;
            free(cur);
            cur = NULL;
        }
    }
}
//输出所有指定元素
void RemoveAll(pList* pplist, DataType d)
{
    assert(pplist);

    if (*pplist == NULL)
    {
        return;
    }

    pNode cur = *pplist;
    pNode temp = *pplist;

    while (cur)
    {
        if ((*pplist)->data == d)
        {
            PopFront(pplist);
            cur = *pplist;
            temp = *pplist;
        }
        else
        {
            if (cur->data == d)
            {
                temp->next = cur->next;
                free(cur);
                cur = temp->next;
            }
            else
            {
                temp = cur;
                cur = cur->next;
            }
        }
    }
}
//链表长度
int GetListLength(pList plist)
{
    int count = 0;

    while (plist)
    {
        count++;
        plist = plist->next;
    }

    return count;
}

//面试题:
//1.从尾到头打印单项链表
void PrintTailToHead_R(pList plist)
{
    if (plist == NULL)
    {
        printf("NULL");
        return;
    }
    else
    {
        PrintTailToHead_R(plist->next);
        printf("<--%d", plist->data);
    }
}//递归法

void PrintTailToHead(pList plist)
{
    pNode cur = NULL;
    pNode print = plist;

    printf("NULL");

    while (cur != plist)
    {
        print = plist;

        while (print->next != cur)
        {
            print = print->next;
        }
        printf("<--%d", print->data);
        cur = print;
    }

    printf("\n");
}//设置尾节点
//2.删除一个无头单项链表的非尾节点(不能遍历链表)
void EraseNotTailNode(pNode pos)
{
    if (pos == NULL)
    {
        return;
    }

    pNode del = pos->next;
    pos->data = del->data;
    pos->next = del->next;
    free(del);
    del = NULL;
}
//3.在无头单项链表的一个节点前插入一个节点(不能遍历链表)
void InsertNotTailNode(pNode pos, DataType d)
{
    if (pos == NULL)
    {
        return;
    }

    pNode NewNode = BuyNode(pos->data);
    NewNode->next = pos->next;
    pos->next = NewNode;
    pos->data = d;
}
//4.单链表实现约瑟夫环(JosephCircle)
pNode JosephCircle(pNode plist, const int M)
{
    int m = M;
    pNode cur = NULL;
    pNode del = NULL;

    if (plist == NULL)
    {
        return NULL;
    }
    cur = plist;

    while (cur->next != cur)
    {
        m = M;

        while (--m)
        {
            cur = cur->next;
        }
        del = cur->next;
        cur->next = del->next;
        cur->data = del->data;
        free(del);
        del = NULL;
    }

    return cur;
}
//5.逆置/反转单链表
void ReverseList(pList *pplist)
{
    pNode pPre = NULL;
    pNode pCur = NULL;
    pNode pNext = NULL;

    assert(pplist);

    pCur = *pplist;

    while (pCur)
    {
        pNext = pCur->next;
        pCur->next = pPre;
        pPre = pCur;
        pCur = pNext;
    }

    *pplist = pPre;
}//三指针法

pNode ReverseList_PF(pList plist)
{
    pList NewList = NULL;
    pNode pCur = plist;
    pNode pPre = NULL;

    while (pCur)
    {
        pPre = pCur->next;
        pCur->next = NewList;
        NewList = pCur;
        pCur = pPre;
    }

    return NewList;
}//头插法
//6.单链表排序(冒泡排序&快速排序)
void BubbleSort(pNode* pplist)
{
    int flag = 0;
    pNode cur = NULL;
    pNode pre = NULL;
    pNode tail = NULL;

    assert(pplist);

    cur = *pplist;
    pre = cur->next;

    if (*pplist == NULL || (*pplist)->next == NULL)
    {
        return;
    }

    while (pre != tail)
    {
        while (pre != tail)
        {
            if (cur->data > pre->data)
            {
                DataType temp = cur->data;
                cur->data = pre->data;
                pre->data = temp;
            }

            cur = cur->next;
            pre = pre->next;
        }

        tail = cur;
        cur = *pplist;
        pre = cur->next;
    }
}//冒泡排序
//7.合并两个有序链表,合并后依然有序
pNode MergeOrderList(pList plist1, pList plist2)
{
    pList NewList = NULL;
    pNode Tail = NULL;
    pNode list1 = plist1;
    pNode list2 = plist2;

    if (list1 == NULL)
    {
        return list2;
    }
    else if (list2 == NULL)
    {
        return list1;
    }

    if (list1->data >= list2->data)
    {
        NewList = Tail = list1;
        list1 = list1->next;
    }
    else
    {
        NewList = Tail = list2;
        list2 = list2->next;
    }

    while (list1 && list2)
    {
        if (list1->data >= list2->data)
        {
            Tail->next = list1;
            list1 = list1->next;
        }
        else
        {
            Tail->next = list2;
            list2 = list2->next;
        }

        Tail = Tail->next;
    }

    if (list1 == NULL)
    {
        Tail->next = list2;
    }
    else
    {
        Tail->next = list1;
    }

    return NewList;
}
//8.查找单链表的中间节点,要求只能遍历一次链表
pNode FindMiddleNode(pNode plist)
{
    pNode fast = NULL;
    pNode slow = NULL;

    if (plist == NULL)
    {
        return NULL;
    }

    fast = plist;
    slow = plist;

    while (fast && fast->next)//fast为NULL时有偶数个节点,fast->nextNULL时有奇数个节点
    {
        slow = slow->next;
        fast = fast->next->next;
    }

    return slow;
}
//9.查找单链表的倒数第K个节点,要求只能遍历一次链表
pNode FindInverseKNode(pNode plist, const int K)
{
    pNode fast = NULL;
    pNode slow = NULL;
    int k = K;

    if (plist == NULL || K <= 0)
    {
        return NULL;
    }

    fast = plist;
    slow = plist;

    while (k--)
    {
        if (fast == NULL)
        {
            return NULL;
        }

        fast = fast->next;
    }

    while (fast)
    {
        slow = slow->next;
        fast = fast->next;
    }

    return slow;
}
//10.删除链表的倒数第K个节点
void DeleteInverseKNode(pNode* pplist, const int K)
{
    int k = K;
    pNode fast = NULL;
    pNode slow = NULL;
    pNode pre = NULL;

    assert(pplist);

    if (K <= 0)
    {
        return ;
    }

    fast = *pplist;
    slow = *pplist;

    while (k--)
    {
        if (fast == NULL)
        {
            return ;
        }

        fast = fast->next;
    }

    while (fast)
    {
        pre = slow;
        slow = slow->next;
        fast = fast->next;
    }

    if (slow == *pplist)
    {
        *pplist = slow->next;
        free(slow);
        slow = NULL;
    }
    else
    {
        pre->next = slow->next;
        free(slow);
        slow = NULL;
    }

}
//11.判断单链表是否带环?若带环,求环的长度?求环的入口?
//判断是否带环
pNode IsListCircle(pNode plist)
{
    pNode fast = plist;
    pNode slow = plist;

    while (fast && fast->next)
    {
        slow = slow->next;
        fast = fast->next->next;

        if (slow == fast)
        {
            return slow;
        }
    }
    return NULL;
}
//求环的长度
int ListCiecleLen(pNode meet)
{
    int count = 1;
    pNode cur = meet;

    if (cur == NULL)
    {
        return 0;
    }

    while (cur->next != meet)
    {
        count++;
        cur = cur->next;
    }

    return count;
}
//求环的入口
pNode ListCircleEnter(pNode plist, pNode meet)
{
    pNode cur = plist;
    pNode pre = meet;

    if (plist == NULL || meet == NULL)
    {
        return NULL;
    }

    while (cur != pre)
    {
        cur = cur->next;
        pre = pre->next;
    }

    return cur;
}
//12.判断两个链表是否相交,若相交,求交点(假设链表不带环)
//判断是否相交
int IsListCross(pNode plist1, pNode plist2)
{
    pNode cur = plist1;
    pNode pre = plist2;

    if (plist1 == NULL || plist2 == NULL)
    {
        return 0;
    }

    while (cur->next != NULL)
    {
        cur = cur->next;
    }

    while (pre->next != NULL)
    {
        pre = pre->next;
    }

    if (cur == pre)
    {
        return 1;
    }
    else
    {
        return 0;
    }
}
//求交点
pNode ListCrossPoint(pNode plist1, pNode plist2)
{
    int count1 = 0;
    int count2 = 0;
    int count;
    pNode cur = plist1;
    pNode pre = plist2;

    while (cur)
    {
        count1++;
        cur = cur->next;
    }

    while (pre)
    {
        count2++;
        pre = pre->next;
    }
    count = count1 - count2;

    cur = plist1;
    pre = plist2;
    if (count > 0)
    {
        while (count--)
        {
            cur = cur->next;
        }
    }
    else if (count < 0)
    {
        while (count++)
        {
            pre = pre->next;
        }
    }

    while (cur != pre)
    {
        cur = cur->next;
        pre = pre->next;
    }

    return cur;
}
//13.判断两个链表是否相交,若相交,求交点(假设链表可能带环)【升级版】
//判断是否相交
int IsListCross_C(pNode plist1, pNode plist2)
{
    pNode temp;
    pNode cur = plist1;
    pNode pre = plist2;
    pNode list1_c = IsListCircle(plist1);
    pNode list2_c = IsListCircle(plist2);

    if (plist1 == NULL || plist2 == NULL)
    {
        return 0;
    }

    if (((list1_c == NULL) && list2_c) || (list1_c && (list2_c == NULL)))
    {
        return 0;
    }

    if (list1_c && list2_c)
    {
        temp = list1_c;

        while (temp->next != list1_c)
        {
            if (temp == list2_c)
            {
                return 2;
            }

            temp = temp->next;
        }

        if (temp == list2_c)
        {
            return 2;
        }

        return 0;
    }

    return IsListCross(plist1, plist2);
}
//求相交的交点
pNode ListCrossPoint_C(pNode plist1, pNode plist2)
{
    int count1 = 0;
    int count2 = 0;
    int count;
    pNode cur = plist1;
    pNode pre = plist2;
    pNode meet1 = IsListCircle(plist1);
    pNode meet2 = IsListCircle(plist2);
    pNode enter1 = ListCircleEnter(plist1, meet1);
    pNode enter2 = ListCircleEnter(plist2, meet2);

    if (enter1 == enter2)
    {
        while (cur != meet1)
        {
            count1++;
            cur = cur->next;
        }

        while (pre != meet1)
        {
            count2++;
            pre = pre->next;
        }
        count = count1 - count2;

        cur = plist1;
        pre = plist2;
        if (count > 0)
        {
            while (count--)
            {
                cur = cur->next;
            }
        }
        else if (count < 0)
        {
            while (count++)
            {
                pre = pre->next;
            }
        }

        while (cur != pre)
        {
            cur = cur->next;
            pre = pre->next;
        }

        return cur;
    }

    return NULL;
}
test.c文件:(测试文件,检验每个函数是否能达到想要的要求)
//头文件
#define _CRT_SECURE_NO_WARNINGS 1

#include "LinkList.h"
void TestPushPopBack()
{
    pList plist;
    InitLinkList(&plist);
    PushBack(&plist, 1);
    PushBack(&plist, 2);
    PushBack(&plist, 3);
    PushBack(&plist, 4);
    PrintLinkList(plist);
    PopBack(&plist);
    PrintLinkList(plist);
    PopBack(&plist);
    PrintLinkList(plist);
    PopFront(&plist);
    PrintLinkList(plist);
    PopBack(&plist);
    PrintLinkList(plist);
    PopBack(&plist);
    PrintLinkList(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestPushPopFront()
{
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 4);
    PrintLinkList(plist);
    PopFront(&plist);
    PrintLinkList(plist);
    PopFront(&plist);
    PrintLinkList(plist);
    PopFront(&plist);
    PrintLinkList(plist);
    PopFront(&plist);
    PrintLinkList(plist);
    PopFront(&plist);
    PrintLinkList(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestFindInsert()
{
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 4);
    PrintLinkList(plist);
    pNode pos = Find(plist, 2);
    printf("%d\n", pos->data);
    Insert(&plist, pos, 5);
    PrintLinkList(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestErase()
{
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 4);
    PrintLinkList(plist);
    pNode pos = Find(plist, 3);
    printf("%d\n", pos->data);
    Erase(&plist, pos);
    PrintLinkList(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestRemove()
{
    pList plist;
    PushFront(&plist, 2);
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 2);
    PushFront(&plist, 2);
    PushFront(&plist, 4);
    PushFront(&plist, 2);
    PrintLinkList(plist);
    //Remove(&plist, 2);
    RemoveAll(&plist, 2);
    PrintLinkList(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestLength()
{
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 4);
    PrintLinkList(plist);
    int count = GetListLength(plist);
    printf("链表中有%d个元素\n", count);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestPrintTailToHead()
{
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 4);
    PrintLinkList(plist);
    PrintTailToHead_R(plist);
    printf("\n");
    PrintTailToHead(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestEraseNotTailNode()
{
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 4);
    PushFront(&plist, 5);
    PushFront(&plist, 6);
    PrintLinkList(plist);
    pNode pos = Find(plist, 4);
    EraseNotTailNode(pos);
    PrintLinkList(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestInsertNotTailNode()
{
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 4);
    PushFront(&plist, 5);
    PushFront(&plist, 6);
    PrintLinkList(plist);
    pNode pos = Find(plist, 3);
    InsertNotTailNode(pos, 7);
    PrintLinkList(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestJosephCircle()
{
    pNode cur = NULL;
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 4);
    PushFront(&plist, 5);
    PushFront(&plist, 6);
    PushFront(&plist, 7);
    PushFront(&plist, 8);
    PushFront(&plist, 9);
    PrintLinkList(plist);
    cur = plist;

    //构环
    while (cur->next)
    {
        cur = cur->next;
    }
    cur->next = plist;

    plist = JosephCircle(plist, 3);

    //解环
    plist->next = NULL;

    PrintLinkList(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestBubbleSort()
{
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 6);
    PushFront(&plist, 5);
    PushFront(&plist, 4);
    PushFront(&plist, 3);
    PushFront(&plist, 2);
    PushFront(&plist, 9);
    PushFront(&plist, 8);
    PushFront(&plist, 7);
    PrintLinkList(plist);
    BubbleSort(&plist);
    PrintLinkList(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestFindMiddleNode()
{
    pNode mid = NULL;
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 6);
    PushFront(&plist, 5);
    PushFront(&plist, 4);
    PushFront(&plist, 3);
    PushFront(&plist, 2);
    PushFront(&plist, 7);
    PrintLinkList(plist);
    mid = FindMiddleNode(plist);
    printf("%d\n", mid->data);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestFindInverseKNode()
{
    pNode find = NULL;
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 6);
    PushFront(&plist, 5);
    PushFront(&plist, 4);
    PushFront(&plist, 3);
    PushFront(&plist, 2);
    PushFront(&plist, 7);
    PrintLinkList(plist);
    find = FindInverseKNode(plist, 3);
    printf("%d\n", find->data);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestReverseList()
{
    pList NewList = NULL;
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 4);
    PushFront(&plist, 5);
    PushFront(&plist, 6);
    PushFront(&plist, 7);
    PrintLinkList(plist);
    ReverseList(&plist);
    PrintLinkList(plist);
    NewList = ReverseList_PF(plist);
    PrintLinkList(NewList);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestMergeOrderList()
{
    pList NewList = NULL;
    pList plist1;
    pList plist2;
    InitLinkList(&plist1);
    PushFront(&plist1, 1);
    PushFront(&plist1, 3);
    PushFront(&plist1, 5);
    PushFront(&plist1, 7);
    PushFront(&plist1, 9);
    PrintLinkList(plist1);

    InitLinkList(&plist2);
    PushFront(&plist2, 2);
    PushFront(&plist2, 4);
    PushFront(&plist2, 5);
    PushFront(&plist2, 6);
    PushFront(&plist2, 8);
    PrintLinkList(plist2);

    NewList = MergeOrderList(plist1, plist2);
    PrintLinkList(NewList);
    DestroyLinkList(&NewList);
    PrintLinkList(NewList);
}

这里写图片描述

void TestDeleteInverseKNode()
{
    pList plist;
    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 6);
    PushFront(&plist, 5);
    PushFront(&plist, 4);
    PushFront(&plist, 3);
    PushFront(&plist, 2);
    PushFront(&plist, 7);
    PrintLinkList(plist);
    DeleteInverseKNode(&plist, 7);
    PrintLinkList(plist);
    DestroyLinkList(&plist);
    PrintLinkList(plist);
}

这里写图片描述

void TestIsListCircle()
{
    pNode Enter;
    int len;
    pNode find1;
    pNode find2;
    pNode Meet;
    pList plist;

    InitLinkList(&plist);
    PushFront(&plist, 1);
    PushFront(&plist, 2);
    PushFront(&plist, 3);
    PushFront(&plist, 4);
    PushFront(&plist, 5);
    PushFront(&plist, 6);
    PushFront(&plist, 7);
    PushFront(&plist, 8);
    find1 = Find(plist, 1);
    find2 = Find(plist, 5);
    find1->next = find2;
    //PrintLinkList(plist);
    Meet = IsListCircle(plist);
    len = ListCiecleLen(Meet);
    Enter = ListCircleEnter(plist, Meet);

    if (Meet != NULL)
    {
        printf("链表带环,环的长度为%d ,环的入口处结点中的值为%d\n", len, Enter->data);
    }
    else
    {
        printf("链表不带环!\n");
    }
}

这里写图片描述

void TestIsListCross()
{
    pNode point;
    int cross;
    pNode find1;
    pNode find2;
    pNode find3;
    pNode find4;
    pList plist1;
    pList plist2;

    InitLinkList(&plist1);
    PushFront(&plist1, 1);
    PushFront(&plist1, 2);
    PushFront(&plist1, 3);
    PushFront(&plist1, 7);
    PushFront(&plist1, 4);
    PushFront(&plist1, 5);
    PushFront(&plist1, 6);
    PushFront(&plist1, 7);
    PushFront(&plist1, 8);
    find1 = Find(plist1, 6);
    find3 = Find(plist1, 1);
    find4 = Find(plist1, 4);
    find3->next = find4;

    InitLinkList(&plist2);
    PushFront(&plist2, 1);
    PushFront(&plist2, 2);
    PushFront(&plist2, 3);
    PushFront(&plist2, 4);
    find2 = Find(plist2, 1);

    find2->next = find1;
    //PrintLinkList(plist1);
    //PrintLinkList(plist2);

    cross = IsListCross_C(plist1, plist2);

    if (cross == 0)
    {
        printf("两条链表不相交!\n");
    }
    else if (cross == 1)
    {
        point = ListCrossPoint(plist1, plist2);
        printf("两条链表相交,交点处节点中的数为%d\n", point->data);
    }
    else
    {
        point = ListCrossPoint_C(plist1, plist2);
        if (point != NULL)
        {
            printf("两条链表相交,交点处节点中的数为%d\n", point->data);
        }
        else
        {
            printf("两条链表相交,交点为整个环\n");
        }
    }
}

这里写图片描述

//主函数,调用所有测试函数
int main()
{
    //TestPushPopBack();
    //TestPushPopFront();
    //TestFindInsert();
    //TestErase();
    //TestRemove();
    //TestLength();
    //TestPrintTailToHead();
    //TestEraseNotTailNode();
    //TestInsertNotTailNode();
    //TestJosephCircle();
    //TestBubbleSort();
    //TestFindMiddleNode();
    //TestFindInverseKNode();
    //TestReverseList();
    //TestMergeOrderList();
    //TestDeleteInverseKNode();
    //TestIsListCircle();
    TestIsListCross();

    system("pause");
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值