[笔记]指针与堆栈

堆栈(skack)是一种先进后出(first in,last on)的表示方式,添加和删除都住在前端,我们可以将堆栈比喻为在堆书本,最下面的书本是最先堆上来的,而最上面的是最后才堆上去的。

我们用一段代码来讲解

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void Insert();
void Delete();
void Dispaly();
void Quit();

struct student 
{
    int id;
    int score;
    struct student* next;
}; 

typedef struct student ST;

ST* p, * head, * s;
int main()
{
    head = (ST*)malloc(sizeof(ST));
    head->next = NULL;
    char a;
    while (1)
    {
        printf("请输入:1.增加,2.删除,3.遍历,4.退出\n");
        a = getch();
        switch (a)
        {
        case'1':
            Insert();
            break;
        case'2':
            Delete();
            break;
        case'3':
            Dispaly();
            break;
        case'4':
            Quit();
            break;
        }
    }
    return 0;
}
void Insert()
{
    p = (ST*)malloc(sizeof(ST));
    printf("\n请输入ID:");
    scanf("%d", &p->id);
    printf("\n请输入分数:");
    scanf("%d", &p->score);
    
    p->next = head->next;
    head->next = p;
    printf("\n添加成功\n\n");
}
void Delete()
{
    char x;
    s = head->next;
    if (head->next == NULL)
    {
        printf("\n无数据\n\n");
    }
    else
    {
        printf("\n确定删除:Y/y");
        x = getch();
        if (x == 'Y' || x == 'y');
        {
            head->next = s->next;
            free(s);
            printf("\n删除成功\n");
        }
    }
}
void Dispaly()
{
    
    if (head->next == NULL)
    {
        printf("\n无数据\n\n");
    }
    else
    {
        s = head->next;
        while (s != NULL)
        {
            printf("\nid是:%d\t学分是:%d\n", s->id, s->score);
            s = s->next;
        }
    }

}
void Quit()
{
    exit(0);
}

我们可以很清楚的看到,添加的节点是加在链表的前端,每一次添加都是在头结点后,因为头结点是不存放数据的,所以在程序开头必须定义头结点

img

因此,这儿所谓的第一个节点是head->next所指向的那一个节点

img

接着让用户选择欲执行的功能,若选1,则执行添加的功能,使其成为链表的第一个节点,如Insert()函数

img

给p分配内存完成创建一个结点,输入数据后,将它插入到头节点之后,形成第一节点,如图所示

img

若选2,则执行删除功能,如Delete()函数所示,首先判断链表是否有数据,若有,则再确认是否真的要删除

img

流程图如下列所示:

img

利用free将节点回收后,头结点链接下一个节点。

若选择3,则执行遍历功能,利用一个将s指向头节点的下一节点,利用while循环来遍历输入,知道下一个节点为空停止

img

来看看运行结果:

img

总结

在学习完单向链表和双向链表后,栈的实现其实很好理解,添加和删除都在头端进行罢了

掌握指针域的链接即可,具体的会在数据结构中学习,这儿就不过多讲解。

本文链接:

https://nullcode.fun/115.html
1 + 8 =
快来做第一个评论的人吧~