C语言学习 18-11-5

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。

猜你喜欢

转载自blog.csdn.net/weixin_42896619/article/details/83783230