(8)数据结构——队列(链表)实现

LinkListQueue.c

  1 /*********************************************************************
  2 *:
  3 *:          Filename: LinkListQueue.h
  4 *:
  5 *:          Author: dspeeding
  6 *:          Copyright (c) 2012, dspeeding
  7 *:
  8 *:        Created at: 2012.06.12
  9 *:     Last modified: 2012.06.12  
 10 *:             
 11 *:      Introduction: 链表队列(数据结构)的c实现
 12 *:                    
 13 *:
 14 *:*********************************************************************/
 15 #ifndef _LINKLISTQUEUE_H_
 16 #define _LINKLISTQUEUE_H_
 17 
 18 #include "ElemType.h"
 19 
 20 #define LINKLISTQUEUE_RET_OK            0
 21 #define LINKLISTQUEUE_RET_ERROR            -1
 22 
 23 typedef void (*Visit)(PCElemType);
 24 
 25 /*定义结点结构体*/
 26 typedef struct TDefLinkListNode
 27 {
 28     ElemType                    data;        /*数据域*/
 29     struct TDefLinkListNode        *next;        /*链表指针*/
 30 }LinkListNode;
 31 
 32 typedef LinkListNode* PLinkListNode;
 33 typedef const LinkListNode CLinkListNode;
 34 typedef const LinkListNode* PCLinkListNode;
 35 
 36 
 37 /*定义队列结构体*/
 38 typedef struct TDefLinkListQueue
 39 {
 40     PLinkListNode        front;                /*队列首指针*/
 41     PLinkListNode        rear;                /*队列尾指针*/
 42 }LinkListQueue;
 43 
 44 typedef LinkListQueue* PLinkListQueue;
 45 typedef const LinkListQueue CLinkListQueue;
 46 typedef const LinkListQueue* PCLinkListQueue;
 47 
 48 /****************************************
 49  Purpose :     初始化链表队列
 50  Input   :     pQueue --队列指针
 51  Return  :     None
 52 *****************************************/
 53 void InitLinkListQueue(PLinkListQueue pQueue);
 54 
 55 
 56 /****************************************
 57  Purpose :     向链表队列中增加一个元素
 58  Input   :     pQueue -- 队列指针
 59             pData  -- 数据指针
 60  Return  :     0       -- 成功
 61             -1       -- 失败
 62 *****************************************/
 63 int AddLinkListQueue(PLinkListQueue pQueue, PCElemType pData);
 64 
 65 
 66 /****************************************
 67  Purpose :     从链表队列中删除一个元素
 68  Input   :     pQueue -- 队列指针
 69             pData  -- 数据
 70  Return  :     0       -- 成功
 71             -1       -- 失败
 72 *****************************************/
 73 int DelLinkListQueue(PLinkListQueue pQueue, PElemType pData);
 74 
 75 
 76 /****************************************
 77  Purpose :     从链表队列中删除一个元素
 78  Input   :     pQueue -- 队列指针
 79             pData  -- 数据指针
 80  Return  :     0       -- 成功
 81             -1       -- 失败
 82 *****************************************/
 83 int OutLinkListQueue(PLinkListQueue pQueue, PElemType pData);
 84 
 85 
 86 /****************************************
 87  Purpose :     从链表队列中读取队首元素
 88  Input   :     pQueue -- 队列指针
 89             pData  -- 数据指针
 90  Return  :     0       -- 成功
 91             -1       -- 失败
 92 *****************************************/
 93 int PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData);
 94 
 95 
 96 /****************************************
 97  Purpose :     判断链表队列是否为空
 98  Input   :     pQueue -- 队列指针
 99  Return  :     0       -- 为空
100             其他   -- 非空
101 *****************************************/
102 int IsEmptyLinkListQueue(PLinkListQueue pQueue);
103 
104 
105 /****************************************
106  Purpose :     清空链表队列中所有元素
107  Input   :     pQueue -- 队列指针
108  Return  :     0       -- 成功
109             -1       -- 失败
110 *****************************************/
111 int ClearLinkListQueue(PLinkListQueue pQueue);
112 
113 /*************************************************************************
114  Purpose :     从栈顶开始遍历整个栈
115  Input   :     pQueue -- 队列指针
116             visit  -- 遍历函数
117  Return  :     None
118  Modify  :
119  Remark  :
120  *************************************************************************/
121 void TraverseLinkListQueue(PLinkListQueue pQueue, Visit visit);
122 
123 #endif

LinkListQueue.c

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <string.h>
  4 #include "LinkListQueue.h"
  5 
  6 /*************************************************************************
  7  Function:     InitLinkListQueue()
  8  Purpose :     初始化链表队列
  9  Input   :     pQueue --队列指针
 10  Return  :     None
 11  Modify  :
 12  Remark  :
 13  *************************************************************************/
 14 void InitLinkListQueue(PLinkListQueue pQueue)
 15 {
 16     /*把队首和队尾指针置空*/
 17     pQueue->front = NULL;
 18     pQueue->rear = NULL;
 19     return ;
 20 }
 21  
 22 /*************************************************************************
 23  Function:     AddLinkListQueue()
 24  Purpose :     向链表队列中增加一个元素
 25  Input   :     pQueue -- 队列指针
 26             mData  -- 数据
 27  Return  :     0       -- 成功
 28             -1       -- 失败
 29  Modify  :
 30  Remark  :
 31  *************************************************************************/
 32 int AddLinkListQueue(PLinkListQueue pQueue, PCElemType pData)
 33 {
 34     /*生成一个新的结点*/
 35     PLinkListNode pNewNode;
 36     pNewNode = malloc(sizeof(LinkListNode));
 37     if(pNewNode == NULL)
 38     {
 39         /*内存分配失败*/
 40         return LINKLISTQUEUE_RET_ERROR;
 41     }
 42     
 43     /*把mData的值赋值给新结点*/
 44     memcpy(&pNewNode->data, pData, sizeof(ElemType));
 45     pNewNode->next = NULL;
 46     
 47     /*若链表队列为空,则新结点既是队首结点又是队尾结点*/
 48     if(pQueue->rear == NULL)
 49     {
 50         pQueue->rear = pNewNode;
 51         pQueue->front = pNewNode;
 52     }
 53     else
 54     {
 55         /*若队列非空,则依次修改队尾结点的指针,使之指向新的队尾结点*/
 56         pQueue->rear->next = pNewNode;
 57         pQueue->rear = pNewNode;
 58     }
 59     
 60     return LINKLISTQUEUE_RET_OK;
 61 }
 62 
 63 /*************************************************************************
 64  Function:     OutLinkListQueue()
 65  Purpose :     从链表队列中删除一个元素
 66  Input   :     pQueue -- 队列指针
 67             pData  -- 数据指针
 68  Return  :     0       -- 成功
 69             -1       -- 失败
 70  Modify  :
 71  Remark  :
 72  *************************************************************************/
 73 int OutLinkListQueue(PLinkListQueue pQueue, PElemType pData)
 74 {
 75     PLinkListNode pNode;
 76     if(pQueue->front == NULL)
 77     {
 78         /*队列为空*/
 79         return LINKLISTQUEUE_RET_ERROR;
 80     }
 81     
 82     memcpy(pData, &pQueue->front->data, sizeof(ElemType));
 83     pNode = pQueue->front;
 84     pQueue->front = pNode->next;
 85     
 86     /*若删除后链表队列为空,则需同时使队尾指针为空*/
 87     if(pQueue->front == NULL)
 88     {
 89         pQueue->rear = NULL;
 90     }
 91     
 92     /*回收该结点内存*/
 93     free(pNode);
 94     pNode = NULL;
 95     
 96     return LINKLISTQUEUE_RET_OK;
 97 }
 98 
 99 /*************************************************************************
100  Function:     PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData)
101  Purpose :     从链表队列中读取队首元素
102  Input   :     pQueue -- 队列指针
103             pData  -- 数据指针
104  Return  :     0       -- 成功
105             -1       -- 失败
106  Modify  :
107  Remark  :
108  *************************************************************************/
109 int PeekLinkListQueue(PLinkListQueue pQueue, PElemType pData)
110 {
111     if(pQueue->front == NULL)
112     {
113         /*队列为空*/
114         return LINKLISTQUEUE_RET_ERROR;
115     }
116     memcpy(pData, &pQueue->front->data, sizeof(ElemType));
117     
118     return LINKLISTQUEUE_RET_OK;
119 }
120 
121 /*************************************************************************
122  Function:     IsEmptyLinkListQueue(PLinkListQueue pQueue)
123  Purpose :     判断链表队列是否为空
124  Input   :     pQueue -- 队列指针
125  Return  :     0       -- 为空
126             其他   -- 非空
127  Modify  :
128  Remark  :
129  *************************************************************************/
130 int IsEmptyLinkListQueue(PLinkListQueue pQueue)
131 {
132     if(pQueue->front == NULL)
133     {
134         /*队列为空*/
135         return 0;
136     }
137     else
138     {
139         return -1;
140     }
141 }
142 
143 /*************************************************************************
144  Function:     ClearLinkListQueue(PLinkListQueue pQueue)
145  Purpose :     清空链表队列中所有元素
146  Input   :     pQueue -- 队列指针
147  Return  :     0       -- 成功
148             -1       -- 失败
149  Modify  :
150  Remark  :
151  *************************************************************************/
152 int ClearLinkListQueue(PLinkListQueue pQueue)
153 {
154     PLinkListNode pNode;
155     /*依次删除队列中的每一个结点,最后使队首指针为空*/
156     pNode = pQueue->front;
157     while(pNode != NULL)
158     {
159         pQueue->front = pQueue->front->next;
160         free(pNode);
161         pNode = pQueue->front;
162     }
163     
164     /*循环结束后队首指针已经为空
165       最后将队尾指针赋值为空*/
166     pQueue->rear = NULL;
167     
168     return LINKLISTQUEUE_RET_OK;
169 }
170 
171 /*************************************************************************
172  Purpose :     从栈顶开始遍历整个栈
173  Input   :     pQueue -- 队列指针
174             visit  -- 遍历函数
175  Return  :     None
176  Modify  :
177  Remark  :
178  *************************************************************************/
179 void TraverseLinkListQueue(PLinkListQueue pQueue, Visit visit)
180 {
181     PLinkListNode pNode;
182     pNode = pQueue->front;
183     while(pNode != NULL)
184     {
185         visit(&(pNode->data));
186         pNode = pNode->next;
187     }
188 }

ElemType.c及ElemType.h见上一节 循环队列 中的实现

testmian.c

 1 /*********************************************************************
 2 *:
 3 *:          Filename: testLinkListQueue.c
 4 *:
 5 *:          Author: DongXiaolin
 6 *:          Copyright (c) 2012, DongXiaolin
 7 *:
 8 *:        Created at: 2012.06.12
 9 *:     Last modified: 2012.06.12  
10 *:             
11 *:      Introduction: 链表队列(数据结构)的demo
12 *:                    
13 *:
14 *:*********************************************************************/
15 #include <stdio.h>
16 #include "LinkListQueue.h"
17 
18 int main()
19 {
20     LinkListQueue mQueue;
21     Stu a[4] = {{1,"zhangsan"}, {2,"lisi"}, {3,"wangwu"}, {4,"zhaoliu"}};
22     int i;
23     
24     /*初始化队列*/
25     InitLinkListQueue(&mQueue);
26     
27     /*向队列中插入数据*/
28     for(i=0;i<4;i++)
29     {
30         if(AddLinkListQueue(&mQueue, &a[i]))
31         {
32             printf("Insert fail[%d][%s]\n", a[i].nStuId, a[i].szStuName);
33         }
34     }
35     
36     TraverseLinkListQueue(&mQueue, visit);
37     
38     /*从队列中删除数据*/
39     ElemType outData;
40     if(OutLinkListQueue(&mQueue, &outData))
41     {
42         printf("Del Data fail\n");
43     }
44     printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName);
45     TraverseLinkListQueue(&mQueue, visit);
46     
47     /*从队列中删除数据*/
48     if(OutLinkListQueue(&mQueue, &outData))
49     {
50         printf("Del Data fail\n");
51     }
52     printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName);
53     TraverseLinkListQueue(&mQueue, visit);
54     
55 
56     
57     /*从队列中提取数据*/
58     if(PeekLinkListQueue(&mQueue, &outData))
59     {
60         printf("Peek Data fail\n");
61     }
62     printf("\nPeek Data[%d][%s]\n", outData.nStuId, outData.szStuName);
63     TraverseLinkListQueue(&mQueue, visit);
64     
65     /*从队列中删除数据*/
66     if(OutLinkListQueue(&mQueue, &outData))
67     {
68         printf("Del Data fail\n");
69     }
70     printf("\nDel Data[%d][%s]\n", outData.nStuId, outData.szStuName);
71     TraverseLinkListQueue(&mQueue, visit);
72     while(IsEmptyLinkListQueue(&mQueue))
73     {
74         if(OutLinkListQueue(&mQueue, &outData))
75         {
76             printf("Del Data fail\n");
77         }
78         printf("\nDo Del Data[%d][%s]\n", outData.nStuId, outData.szStuName);
79     }
80     
81     /*清空队列*/
82     ClearLinkListQueue(&mQueue);
83     
84     return 0;
85 }

makefile 如下 通用Makefile

转载于:https://www.cnblogs.com/dspeeding/p/3261995.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值