数据结构单链表C语言实现顺序栈

136 阅读2分钟

最近在学数据结构,需要用C语言实现功能

上掘金一搜,发现线性表代码实现的文章里面的代码要么就是用JAVA实现,那些大学老师不一定能看得懂JAVA,要么就是咔咔把代码剪成几段放上来,根本运行不了,有的压根就不是完整的代码,就放几个函数上去

我就是不会才来看啊,想着抄一个现成的,结果我还得补全代码

经过我东拼西凑,弄出来线性表C语言实现的完整代码,自己运行了几遍没问题

顺序栈

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

// 定义单链表中的节点
typedef struct LNode
{
    int data;
    struct LNode *next;
} LNode, *LinkList; // 定义两个名称 前者侧重于表示节点, 后者侧重于表示单链表

// 头插法建立单链表
LinkList List_HeadInsert(LinkList L)
{
    int x = 0;
    LNode *s;
    L = (LinkList)malloc(sizeof(LNode)); // 创建头节点
    L->next = NULL;
    for (int i = 0; i < 5; i++) // 初始化一个长度为5的链表
    {
        s = (LNode *)malloc(sizeof(LNode)); // 创建新节点
        s->data = x;                        // 输入节点的初始值
        s->next = L->next;                  // 新节点的后向指针指向头节点的后向指针
        L->next = s;                        // 头节点的后向指针指向新节点 , 完成头插
        x++;                                // 指定数据+1, 此处可DIY
    }
    return L;
}

// 尾插法建立单链表
LinkList List_TailInsert(LinkList L)
{
    int x = 0;
    LNode *s, *T;                        // T为表尾指针
    L = (LinkList)malloc(sizeof(LNode)); // 创建头节点
    s, T = L;                            // 先初始化指向头节点
    for (int i = 0; i < 5; i++)
    {
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        T->next = s; // 此处是让前节点的后向指针指向新节点
        T = s;       // T指向新的表尾节点
    }
    T->next = NULL; // 表尾指向NULL
    return L;
}

// 按序号查找节点值
LNode *GetElem(LinkList L, int i)
{
    int count = 1;      // 计数变量
    LNode *p = L->next; // 头节点next赋给P
    if (i == 0)
    {
        return L; // i = 0返回头节点
    }
    if (i < 1)
    {
        printf("%s", "warn input!");
        return NULL; // 错误序号
    }
    while (p && count < i)
    { // 从第一个节点开始找, 查找第i个节点, 此处判断即是判断时候到最后null的时候任然没有找到节点.
        p = p->next;
        count++;
    }
    return p;
}

// 插入新数据元素 i:插入位置, elem:插入元素值
LNode *InsetElem(LinkList L, int i, int elem)
{
    LNode *preNode = GetElem(L, i - 1);
    LNode *newNode = (LNode *)malloc(sizeof(LNode));
    newNode->data = elem;
    newNode->next = preNode->next;
    preNode->next = newNode;
    return L;
}

// 删除元素
LNode *delElem(LinkList L, int i)
{
    LNode *preNode = GetElem(L, i - 1);
    preNode->next = preNode->next->next;
    free(preNode->next);
    return L;
}

// 更改(更新元素)
LNode *changeElem(LinkList L, int i, int elem)
{
    LNode *Node = GetElem(L, i);
    Node->data = elem;
    return L;
}

int main(int argc, char const *argv[])
{
    LinkList list;
    LinkList L = List_HeadInsert(list);
    InsetElem(L, 2, 88);
    // delElem(L, 2);
    changeElem(L, 2, 8998);
    LNode *Node1 = GetElem(L, 2);
    printf("%d", Node1->data);
    return 0;
}