4-29 c语言之栈,队列,双向链表

  今天学习了数据结构中栈,队列的知识

  相对于单链表来说,栈和队列就是添加的方式不同,队列就相当于排队,先排队的先出来(FIFO),而栈就相当于弹夹,先压进去的子弹后出来(FILO)。

首先看一下栈(Stack)的实现

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #define TRUE 1
 4 #define FALES 0
 5 typedef struct NODE
 6 {
 7     int i;
 8     struct NODE *pNext;                                        //指向的是  上一个从栈顶刚压入的结点
 9 }Stack;
10 typedef int BOOL;                                            //因为c语言里没有布尔类型,所以用int模拟一下
11 void Push(Stack **pTop,int i);
12 BOOL IfEmpty(Stack *pTop);        
13 Stack *Pop(Stack **pTop);                                    //出栈操作
14 int main()
15 {
16     Stack *pTop = NULL;
17 
18 
19 }
20 void Push(Stack **pTop,int i)                            //压栈操作
21 {
22     Stack *pTemp = (Stack *)malloc(sizeof(Stack));
23     pTemp->i = i;
24     pTemp->pNext = NULL;
25     
26     pTemp->pNext = *pTop;
27     *pTop = pTemp;
28 
29     return;
30 }
31 BOOL IfEmpty(Stack *pTop)                                            //因为c++的STL容器里存在判断栈是否为空的操作,在这模拟一下
32 {
33     if(pTop == NULL)
34         return TRUE;
35     return FALES;
36 }
37 Stack *Pop(Stack **pTop)
38 {
39     Stack *pPop = NULL;
40     if(IfEmpty(*pTop))
41     {
42         return NULL;
43     }
44     else
45     {
46         pPop = *pTop;
47         *pTop = (*pTop)->pNext;
48         return pPop;
49     }
50 }

其次队列(Queue)的实现非常简单,队列压入的实现就和单链表尾添加一样,而弹出就和单链表头删除是一样的,只不过不需要free直接返回队首指针即可;

那么栈和栈区又有什么区别呢?先看这样一段程序

1 #include<stdio.h>
2 int main()
3 {
4   int i = 1;
5   printf("%d   %d\n ",i,i++);
6 
7   return 0;
8 }

可能一打眼看 就认为是1  1,但测试后发现是 2  1,这就不免让人联想到先进后出的特点了,由于printf是一个标准输出库函数,i 和 i++都算做是两个实参,在函数中,形参也是一个局部变量,在函数这个堆区中存在,按照图中出栈的顺序先B后A,那么先 i++ 出来为 1 ,i 其次出来就为2了(启示就是,在栈区中 若一个函数的参数用了同一个变量 ,记得栈的特点)

双向链表,故名思意就是有一个链表可正向可反向,也就是在添加每个结点的时候,加入一个指针,指向上一个结点的地址,代码如下:

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 typedef struct NODE
 4 {
 5     int id;
 6     struct NODE *pNext;
 7     struct NODE *pLast;                     //指向上个结点
 8 }List;
 9 void AddNode(List **ppHead,List **ppEnd,int id);
10 int main()
11 {
12     List *pHead = NULL;
13     List *pEnd = NULL;
14     AddNode(&pHead,&pEnd,1);
15     AddNode(&pHead,&pEnd,2);
16     AddNode(&pHead,&pEnd,3);
17     AddNode(&pHead,&pEnd,4);
18 
19     while(pHead)
20     {
21         printf("%d\n",pHead->id);
22         pHead = pHead->pNext;
23     }
24     printf("\n");
25 
26 
27     while(pEnd)
28     {
29         printf("%d\n",pEnd->id);
30         pEnd = pEnd->pLast;
31     }
32 
33 
34 }
35 void AddNode(List **ppHead,List **ppEnd,int id)
36 {
37     List *pTemp = (List *)malloc(sizeof(List));
38     pTemp->id = id;
39     pTemp->pLast = NULL;
40     pTemp->pNext = NULL;
41 
42     if(*ppHead == NULL)
43     {
44         *ppHead = pTemp;
45         *ppEnd = pTemp;
46     }
47     else
48     {
49         (*ppEnd)->pNext = pTemp;
50         pTemp->pLast = *ppEnd;
51         *ppEnd = pTemp;
52     }
53     return;
54 }

2019-04-29 22:32:52 编程菜鸟自我反省,大佬勿喷,谢谢!!!

猜你喜欢

转载自www.cnblogs.com/xgmzhna/p/10793351.html
今日推荐