C语言数据结构第三章—— 链表栈

数据结构第二章—— 链表栈

get 到的东西:

熟练度*N,多写写就对链表的内容更加清楚了

  1. 在建的时候有点犹豫用Node p改的数据能不能在list里也有改
  2. list的amount没传回去?为什么啊…我直接用它的plist->amount++了!
  • 通过调试找到返回值不对的问题了,就是plist->amount这里
  • …我忘了初始化plist->amount了 干= =!
  1. 要在指针里边的操作改动的数据才会传回去,不然就是有点像读取地址上的数值后对数值进行的操作了。
    但是操作是会留下来的,就是p对head的next操作,数链上的节点会留下来
  2. 在init数链的时候忘了让 p = p->next 了
  3. 想明白了,对传过来的指针或者同级指针进行操作才有用,才能返回到之前的函数。如果对指针用*取的值操作,只能影响到传回去的下级指针,对这一层指针没用

实现流程

栈只是栈顶来做插入和删除操作,栈顶放在链栈的头部还是尾部呢?
由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢?
所以比较好的办法是把栈顶放在单链表的头部

  • 链表有时候会有头结点,为了方便读入和删除等操作,在这里就不用头结点了。

  • 入栈操作Push
    出栈操作Pop
    LinkStack,还有一些常用函数名称
    一些函数名

  1. 结构体
    存数据和next的node,存节点和head的list

  2. 写输入函数
    我这次是直接把两个结构体创建了,然后把list引到函数里

List list = *plist;

C语言代码——实现部分操作

// 2020/2/14 链表栈
#include <stdio.h>
#include <stdlib.h>

typedef struct node{
    int data;
    struct node *next;
}Node;

typedef struct list{
    int amount;
    Node *head;
}List;

void Init_Stack(List *plist);
void Print_Stack(List *plist);
void Add_Data(List *plist);
void Pop_Data(List *plist);

int main()
{
    List list;
    Init_Stack(&list);
    Print_Stack(&list);
    Add_Data(&list);
    Print_Stack(&list);
    Pop_Data(&list);
    Print_Stack(&list);
    printf("Hello world!\n");
    return 0;
}

void Init_Stack(List *plist)
{
    List list = *plist;
    plist->head = (Node*)malloc(sizeof(Node));
    list.head = plist->head;
    list.head->next = NULL;
    list.amount = 0;
    Node *p = list.head;
    int input;
    do{
        scanf("%d", &input);
        if(input!=-1){
            p->data = input;
            p->next = (Node*)malloc(sizeof(Node));
            p = p->next;
            p->next = NULL;
            list.amount ++;
        }
    }while(input!=-1);
    plist->amount = list.amount;

}

void Print_Stack(List *plist)
{
    Node *p = plist->head;
    int amount = plist->amount;
    int i;
    printf("the data amount is %d\n", amount);
    for( i=1 ; i<=amount ; i++)
    {
        printf("the data in %d is %d\n", i, p->data);
        p = p->next;
    }
}

void Add_Data(List *plist)
{
    int input_data;
    printf("input the data you want to put in:");
    scanf("%d", &input_data);
    Node *p = (Node*)malloc(sizeof(Node*));
    p->next = plist->head;
    p->data = input_data;
    plist->amount++;
    plist->head = p;
}

void Pop_Data(List *plist)
{
    Node *p = plist->head;
    p = p->next;
    free(plist->head);
    plist->head = p;
    plist->amount --;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值