1. 程式人生 > >C語言學習 18-11-5

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。