C语言 数据结构 单链表练习

#include <stdio.h>
#include <stdlib.h>
/*2,宏定义部分--bool*/
#define bool char
#define true 1
#define false 0

/*3.自定义数据元素类型*/
typedef int Elemtype;

/*4.单链表的结构体*/
typedef struct LNode
{
    Elemtype data;   //元素
    struct LNode* next;   //指向下个结点的指针
}LNode, *LinkList;   //结点和头指针

/*5.单链表的初始化(头结点的初始化)*/
bool InitLinkList(LinkList L)
{
    L->data = 0;
    L->next = NULL;
    return true;
}

/*6.单链表的打印*/
bool Print_LinkList(LinkList L)
{
    LNode* p = L;
    while(p->next)
    {
        p = p->next;
        printf("%d->",p->data);
    }
    printf("NULL\n");
    return true;
}

/*7.单链表的头插法*/
bool insert_Head(LinkList L)
{
    int NewData;
    //开辟一个空间给新结点
    LNode* NewNode = (LNode*)malloc(sizeof(LNode));
    //给新结点赋值
    printf("请输入要头插的元素:");
    scanf("%d",&NewData);
    NewNode->data = NewData;
    //让新元素指向第一个结点
    NewNode->next = L->next;
    //让头结点指向新结点
    L->next = NewNode;
    //长度加1(用头节点的data储存链表长度)
    L->data++;

    return true;
}

/*8.单链表的尾插法*/
bool Insert_tail(LinkList L)
{
    LNode* NewNode;
    //用来找到尾结点的指针
    LNode* TailNode = L;
    Elemtype NewData;
    NewNode = (LNode*)malloc(sizeof(LNode));
    NewNode->next = NULL;
    printf("请输入要尾插的元素:");
    scanf("%d",&NewData);
    NewNode->data = NewData;
    //找到尾结点
    while(TailNode->next)
    {
        TailNode = TailNode->next;
    }
    //让尾结点指向新结点
    TailNode->next = NewNode;
    L->data++;

    return true;
}

/*9.单链表的按位查找*/
LNode* GetElem(LinkList L, int i)
{
    LNode* p = L;
    if(i == 0)
    {
        return L;
    }
    if(i < 1 || i > L->data)
    {
        printf("error!\n");
        return NULL;
    }
    for(int j = 0; j < i; j++)
    {
        p = p->next;
    }
    return p;
}

/*10.按值查找数据元素*/
LNode* LocateElem(LinkList L, Elemtype e)
{
    if(!L->next)
    {
        printf("empty!\n");
        return L;
    }
    LNode* p = L;
    while(p->next)
    {
        p = p->next;
        if(p->data == e)
        {
            return p;
        }
    }
    return NULL;
}

/*11.按位插入数据元素*/
bool Insert_site(LinkList L, int i, Elemtype e)
{
    if(i < 1 || i > (L->data+1))
    {
        printf("error!\n");
        return false;
    }
    LNode* NewNode = (LNode*)malloc(sizeof(LNode));//新结点
    NewNode->data = e;
    LNode* p = GetElem(L, i-1);  //用来指向插入结点前一个结点


    NewNode->next = p->next;
    p->next = NewNode;
    L->data++;
    return true;
}

/*12.按位删除*/
bool DeleteSite(LinkList L, int i)
{
    if(i < 1 || i > L->data)
    {
        printf("empty!\n");
        return false;
    }
    LNode* p = GetElem(L, i-1);
    LNode* q = p->next;//储存删除的结点
    p->next = p->next->next;
    free(q);
    return true;
}

/*13.销毁单链表*/
bool Destory_Linklist(LinkList L)
{
    while(L->data)
    {
        DeleteSite(L,1);
        L->data--;
    }
    printf("销毁完毕!\n");   //不知道为啥这个没输出,有大神的话可以指教一下
    free(L);

    return true;
}
int main()
{
    //定义结构体并开辟空间
    LinkList L = (LNode*)malloc(sizeof(LNode));
    //初始化
    InitLinkList(L);
    //插入一些元素用于测试
    Insert_tail(L);
    Insert_tail(L);
    Insert_tail(L);
    //插入后的表内容
    Print_LinkList(L);

    //测试按位查找
    //printf("请输入查找结点的位置:");
    //LNode* p = GetElem(L,0);
    //printf("%d",p->data);

    //测试按位插入
    Insert_site(L,1,78);
    Print_LinkList(L);

    //测试按位删除
    DeleteSite(L, 2);
    Print_LinkList(L);
    //测试销毁链表
    Destory_Linklist(L);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

百年bd

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值