数据结构线性表C语言实现链表模板

C语言链表模板

#include <stdio.h>
#include <stdlib.h>
/************************************************
 * C语言链表模板
 * 
 * 1.InitLinkList(ElemType data) 初始化链表:动态分
 * 配头结点,并对头结点的next赋NULL值和数据域赋值,返回
 * 头结点地址.
 * 
 * 2.InsertLinkList(LinkList *head, ElemType data)
 * 添加数据:找到链表的表尾,动态生成一个新结点,对新结点
 * 的next赋NULL值和数据域赋值并将新结点添加到链表尾部.
 * 
 * 3.DeleteLinkList(LinkList *head, ElemType dele
 * teData) 删除数据:找到需要删除的数据的结点,让这个结
 * 点的上一个结点指向它的下一个结点并释放该结点,没有找
 * 到则提示没有找到需要删除的数据.
 * 
 * 4.void UpdateLinkList(LinkList *head, ElemType
 *  deleteData, ElemType updateData) 更新数据:找到
 * 需要更新的数据并进行更新,如果没有找到则提示没有找到
 * 需要更新的数据.
 * 
 * 5.SelectLinkList(LinkList *head, ElemType data)
 * 查找数据:遍历所有结点查找是否有该数据,找到返回TRUE
 * 没有找到返回FALSE.
 * 
 * 6.DestoryLinkList(LinkList *head) 销毁链表:释放
 * 链表中的所有结点并将头指针赋NULL值.
 * 
 * 7.DisPlayLinkList(LinkList *head) 输出链表数据.
 * 
 * 8.OrderLinkList(LinkList *head) 数据排序:将原有链
 * 表赋值一份进行冒泡排序,排序完成后对赋值的链表进行输出
 * 和销毁.
 * 
 * 作者:西瓜小羽毛
 * 日期:2020/7/22
 ************************************************/
#define TRUE 1
#define FALSE 0
typedef bool BOOL;
typedef int ElemType;
typedef struct LinkList
{
    ElemType data;
    LinkList *next;
} LinkList;
/* 初始化链表 */
LinkList *InitLinkList(ElemType data)
{
    LinkList *head = (LinkList *)malloc(sizeof(LinkList));
    head->next = NULL;
    head->data = data;
    return head;
}
/* 添加数据 */
void InsertLinkList(LinkList *head, ElemType data)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    LinkList *pNode = head;
    while (pNode->next)
    {
        pNode = pNode->next;
    }
    pNode->next = (LinkList *)malloc(sizeof(LinkList));
    pNode = pNode->next;
    pNode->next = NULL;
    pNode->data = data;
}
/* 删除数据 */
void DeleteLinkList(LinkList *head, ElemType deleteData)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    LinkList *pNode = head;
    LinkList *qNode = NULL;
    if (pNode->data == deleteData)
    {
        qNode = pNode->next;
        pNode->data = qNode->data;
        pNode->next = qNode->next;
        free(qNode);
        return;
    }
    while (pNode->next)
    {
        if (pNode->next->data == deleteData)
        {
            break;
        }
        pNode = pNode->next;
    }
    if (pNode->next == NULL)
    {
        printf("没有找到需要删除的数据\n");
        return;
    }
    else
    {
        pNode->next = pNode->next->next;
        return;
    }
}
/* 更新数据 */
void UpdateLinkList(LinkList *head, ElemType deleteData, ElemType updateData)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    LinkList *pNode = head;
    while (pNode)
    {
        if (pNode->data == deleteData)
        {
            break;
        }
        pNode = pNode->next;
    }
    if (pNode == NULL)
    {
        printf("没有找到要修改的数据\n");
        return;
    }
    else
    {
        pNode->data = updateData;
        return;
    }
}
/* 查找数据 */
BOOL SelectLinkList(LinkList *head, ElemType data)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return FALSE;
    }
    LinkList *pNode = head;
    while (pNode)
    {
        if (pNode->data == data)
        {
            break;
        }
        pNode = pNode->next;
    }
    if (pNode == NULL)
    {
        printf("没有找到你需要的数据\n");
        return FALSE;
    }
    else
    {
        return TRUE;
    }
}
/* 销毁链表 */
void DestoryLinkList(LinkList *head)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    LinkList *pNode = head;
    LinkList *pNext = head->next;
    while (pNext)
    {
        free(pNode);
        pNode = pNext;
        pNext = pNext->next;
    }
    free(pNode);
}
/* 输出链表 */
void DisPlayLinkList(LinkList *head)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    LinkList *pNode = head;
    while (pNode)
    {
        printf("%d ", pNode->data);
        pNode = pNode->next;
    }
    printf("\n");
}
/* 数据排序 */
void OrderLinkList(LinkList *head)
{
    if (head == NULL)
    {
        printf("链表未初始化\n");
        return;
    }
    /* 复制链表 */
    LinkList *tHead = (LinkList *)malloc(sizeof(LinkList));
    tHead->next = NULL;
    tHead->data = head->data;
    LinkList *pNode = head;
    LinkList *ptNode = tHead;
    while (pNode->next)
    {
        LinkList *node = (LinkList *)malloc(sizeof(LinkList));
        node->data = pNode->next->data;
        node->next = NULL;
        ptNode->next = node;
        ptNode = ptNode->next;
        pNode = pNode->next;
    }
    ptNode = tHead;
    LinkList *qtNode = NULL;
    while (ptNode->next)
    {
        qtNode = tHead;
        while (qtNode->next)
        {
            if (qtNode->data > qtNode->next->data)
            {
                ElemType data = qtNode->next->data;
                qtNode->next->data = qtNode->data;
                qtNode->data = data;
            }
            qtNode = qtNode->next;
        }
        ptNode = ptNode->next;
    }
    /* 输出排序后的链表 */
    DisPlayLinkList(tHead);
    /* 销毁复制的链表 */
    DestoryLinkList(tHead);
}

测试代码

#include "LinkList.h"
int main()
{
    /* 链表测试代码 */
    LinkList *head = InitLinkList(30);
    InsertLinkList(head, 35);
    InsertLinkList(head, 24);
    InsertLinkList(head, 25);
    InsertLinkList(head, 56);
    DeleteLinkList(head, 10);
    DeleteLinkList(head, 30);
    printf("排序前:");
    DisPlayLinkList(head);
    printf("排序后:");
    OrderLinkList(head);
}

输出结果

没有找到需要删除的数据
排序前:35 24 25 56
排序后:24 25 35 56

面向对象程序设计课程作业 1. 请创建一个数据类型为T的链表模板List,实现以下成员函数: 1) 默认构造函数List(),将该链表初始化为一个空链表(10分) 2) 拷贝构造函数List(const List& list),根据一个给定的链表构造当前链表(10分) 3) 析构函数~List(),释放链表中的所有节点(10分) 4) Push_back(T e)函数,往链表最末尾插入一个元素为e的节点(10分) 5) operator<<()友元函数,将链表的所有元素按顺序输出(10分) 6) operator=()函数,实现两个链表的赋值操作(10分) 7) operator+()函数,实现两个链表的连接,A=B+C(10分) 2. 请编写main函数,测试该类模板的正确性: 1) 用List模板定义一个List类型的模板类对象int_listB,从键盘读入m个整数,调用Push_back函数将这m个整数依次插入到该链表中;(4分) 2) 用List模板定义一个List类型的模板类对象int_listC,从键盘读入n个整数,调用Push_back函数将这n个整数依次插入到该链表中;(4分) 3) 用List模板定义一个List类型的模板类对象int_listA,调用List的成员函数实现A = B + C;(4分) 4) 用cout直接输出int_listA的所有元素(3分) 5) 用List模板定义List类型的模板类对象double_listA, double_listB, double_listC,重复上述操作。(15分) 3. 输入输出样例: 1) 输入样例 4 12 23 34 45 3 56 67 78 3 1.2 2.3 3.4 4 4.5 5.6 6.7 7.8 2) 输出样例 12 23 34 45 56 67 78 1.2 2.3 3.4 4.5 5.6 6.7 7.8
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值