线性表的链式存储

#include <stdio.h>
#include <malloc.h>
#include <stdbool.h>

typedef int ElemType;
typedef struct NODE{
    ElemType data;
    struct NODE* next;
}Node,*NodePtr;//链表节点
typedef struct LIST{
    NodePtr head;
    int size;
}List,*ListPtr;//链表,头结点为0位置

ListPtr InitList();//初始化链表

void InsertList(ListPtr L, int i, ElemType e);//如果i满足条件在链表的i位置插入元素e

void DeleteList(ListPtr L, int i, ElemType* e);//如果i满足条件在链表的i位置删除元素,并用e返回他的值

bool EmptyList(ListPtr L);//判断链表是否为空

int LengthList(ListPtr L);//返回链表长度

void GetElemType(ListPtr L, int i, ElemType* e);//用e返回链表i位置的元素

void FreeList(ListPtr L);//释放链表内存

void PrintList(ListPtr L);//打印链表

void InsertTail(ListPtr L, ElemType e);//尾插法将元素插入表尾

int main()
{
    puts("创建链表");
    ListPtr L = InitList();
    puts("判断链表是否为空");
    if (EmptyList(L))
    {
        puts("链表为空");
    }
    else
    {
        puts("链表不为空");
    }
    
    puts("输出链表长度");
    printf("%d\n", LengthList(L));
    puts("将0到9插入链表当中");
    for (int i = 0; i < 10; i++)
    {
        InsertTail(L, i);
    }
    puts("删除链表中第5个元素,并用e返回它的值");
    ElemType e;
    DeleteList(L, 5, &e);
    printf("e的值是%d\n", e);
    puts("判断链表是否为空");
    if (EmptyList(L))
    {
        puts("链表为空");
    }
    else
    {
        puts("链表不为空");
    }
    puts("输出链表长度");
    printf("%d\n", LengthList(L));
    puts("打印链表");
    PrintList(L);
    puts("释放链表内存");
    FreeList(L);
    system("pause");
    return 0;
}

ListPtr InitList()
{
    ListPtr L = (ListPtr)malloc(sizeof(List));
    L->head = (NodePtr)malloc(sizeof(Node));
    L->head->next = NULL;
    L->size = 0;
    return L;
}

void InsertList(ListPtr L, int i, ElemType e)
{
    if (i < 1 || i > L->size + 1)
    {
        return;
    }
    NodePtr newnode = (NodePtr)malloc(sizeof(Node));
    newnode->data = e;
    newnode->next = NULL;
    NodePtr temp;
    temp = L->head;
    int count = 0;
    while (count != i - 1)
    {
        temp = temp->next;
        count++;
    }
    newnode->next = temp->next;
    temp->next = newnode;
    L->size++;
}

void DeleteList(ListPtr L, int i, ElemType* e)
{
    if (i < 0 || i > L->size)
    {
        puts("1111");
        return;
    }
    if (EmptyList(L))
    {
        return;
    }
    NodePtr temp;
    temp = L->head;
    int count = 0;
    while (count != i - 1)
    {
        temp = temp->next;
        count++;
    }
    *e = temp->next->data;
    NodePtr freenode = temp->next;
    temp->next = temp->next->next;
    free(freenode);
    L->size--;
}

bool EmptyList(ListPtr L)
{
    if (L->size == 0)
    {
        return true;
    }
    else
    {
        return false;
    }
}

int LengthList(ListPtr L)
{
    return L->size;
}

void GetElemType(ListPtr L, int i, ElemType* e)
{
    if (i < 0 || i > L->size)
    {
        return;
    }
    if (EmptyList(L))
    {
        return;
    }
    NodePtr temp;
    temp = L->head;
    int count = 0;
    while (count != i - 1)
    {
        temp = temp->next;
        count++;
    }
    *e = temp->next->data;
}

void FreeList(ListPtr L)
{
    if (!EmptyList(L))
    {
        return;
    }
    NodePtr tempnode = L->head->next;
    NodePtr freenode;
    while (tempnode != NULL)
    {
        freenode = tempnode;
        tempnode = tempnode->next;
        free(freenode);
    }
}

void PrintList(ListPtr L)
{
    NodePtr tempnode = L->head->next;
    while (tempnode != NULL)
    {
        printf("%d ", tempnode->data);
        tempnode = tempnode->next;
    }
    putchar('\n');
}

void InsertTail(ListPtr L, ElemType e)
{
    InsertList(L, LengthList(L) + 1, e);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值