数据结构第二章—— 链表栈
get 到的东西:
熟练度*N,多写写就对链表的内容更加清楚了
- 在建的时候有点犹豫用Node p改的数据能不能在list里也有改
- list的amount没传回去?为什么啊…我直接用它的plist->amount++了!
- 通过调试找到返回值不对的问题了,就是plist->amount这里
- …我忘了初始化plist->amount了 干= =!
- 要在指针里边的操作改动的数据才会传回去,不然就是有点像读取地址上的数值后对数值进行的操作了。
但是操作是会留下来的,就是p对head的next操作,数链上的节点会留下来 - 在init数链的时候忘了让 p = p->next 了
- 想明白了,对传过来的指针或者同级指针进行操作才有用,才能返回到之前的函数。如果对指针用*取的值操作,只能影响到传回去的下级指针,对这一层指针没用
实现流程
栈只是栈顶来做插入和删除操作,栈顶放在链栈的头部还是尾部呢?
由于单链表有头指针,而栈顶指针也是必须的,那干吗不让它俩合二为一呢?
所以比较好的办法是把栈顶放在单链表的头部。
-
链表有时候会有头结点,为了方便读入和删除等操作,在这里就不用头结点了。
-
入栈操作Push
出栈操作Pop
LinkStack,还有一些常用函数名称
-
结构体
存数据和next的node,存节点和head的list -
写输入函数
我这次是直接把两个结构体创建了,然后把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 --;
}