1.双向链表
双向链表是每个单项链表的节点都多了一个指向前一个节点的指针。
#include <stdio.h>
typedef struct DLLNODE
{
struct DLLNODE *p_last;
int id;
struct DLLNODE *p_next;
}DLLNode;
int main()
{
printf("Hello SLAM\n");
return 0;
}
2.在尾部添加双向链表的节点
双向链表的尾部添加较为简单,只是多一步将新节点的p_last指向前一个节点。
#include <stdio.h>
typedef struct DLLNODE
{
struct DLLNODE *p_last;
int id;
struct DLLNODE *p_next;
}DLLNode;
void AppendDLLNode(DLLNode **pp_head, DLLNode **pp_end, int id);
int main()
{
return 0;
}
void AppendDLLNode(DLLNode **pp_head, DLLNode **pp_end, int id)
{
DLLNode *new_node = (DLLNode*)malloc(sizeof(DLLNode));
new_node->id = id;
new_node->p_last = NULL;
new_node->p_next = NULL;
if(*pp_head)
{
new_node->p_last = *pp_end;
(*pp_end)->p_next = new_node;
}
else
{
*pp_head = new_node;
}
*pp_end = new_node;
return;
}
3.队列和栈
队列是一种满足 先入先出(FIFO) 的数据结构;栈是一种满足 先入后出(FILO) 的数据结构。
队列会在数据结构阶段继续深入了解,本次只完成栈的代码实现。
1.) 栈的结构
typedef struct STACKNODE
{
int id;
struct STACKNODE *p_next;
}StackNode;
对于栈结构来说,只需要一个方向向下的指针即可,这样可以保证找到下一个节点。
2.) 压栈与出栈
#include <stdio.h>
#include <stdlib.h>
typedef struct STACKNODE
{
int id;
struct STACKNODE *p_next;
}StackNode;
void PushStack(StackNode *p_top, int id);
StackNode* PopStack();
int main()
{
StackNode *p_top = NULL;
StackNode *pop_node = NULL;
PushStack(&p_top, 1);
PushStack(&p_top, 2);
PushStack(&p_top, 3);
pop_node = PopStack(&p_top);
pop_node = PopStack(&p_top);
pop_node = PopStack(&p_top);
return 0;
}
void PushStack(StackNode **pp_top, int id)
{
StackNode *new_node = (StackNode*)malloc(sizeof(StackNode));
new_node->id = id;
new_node->p_next = NULL;
new_node->p_next = *p_top;
*p_top = new_node;
return 0;
}
StackNode* PopStack(StackNode **pp_top)
{
StackNode *temp_node = NULL;
if(*pp_top)
{
temp_node = *pp_top;
*pp_top = (*pp_top)->p_next;
temp_node->p_next = NULL;
return temp_node;
}
else
{
return NULL;
}
}
可以下断点去查看添加的节点是否是 3->2->1 的顺序,出栈的顺序 先3再2最后1。
4. 栈、队列、链表的相同与不同
1.) 相同:都是线性表
2.) 不同:(1.) 队列和栈不能进行中间插入
(2.)队列两边都可以进行插入
(3.)栈只能在栈顶进行入栈或出栈操作
5. 栈区
栈区:所有局部变量都是以栈的形式存储在栈区的
例1.
#include<stdio.h>
int main()
{
int a = 1;
printf("%d, %d", a, a++);
return 0;
}
输出结果为2, 1。
原因就是 a 是局部变量,所以在存储时先存储a,在a之上存储a++,当向外取变量时,会先取a++,再取a,故当执行完上述语句之后,实际是先a++,再取a。