以純C實現幾個基本的資料結構(2)

2021-08-29 09:58:06 字數 3076 閱讀 5952

前篇算是開宗明義,此篇接續第一部分的單向佇列資料結構。

1、設計

佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。佇列中沒有元素時,稱為空佇列。佇列的資料元素又稱為佇列元素。在佇列中插入乙個佇列元素稱為入隊,從佇列中刪除乙個佇列元素稱為出隊。因為佇列只允許在一端插入,在另一端刪除,所以只有最早進入佇列的元素才能最先從佇列中刪除,故佇列又稱為先進先出(fifo—first in first out)線性表。

從上可知,佇列首先是乙個線性表,也就是說其資料元素是按照順序存放在乙個連續的記憶體空間內的。然後遵頊先入先出原則,所以刪除和新增的操作,只能從隊尾和隊頭進行操作。

所以我們這麼設計(和前篇的鍊錶不一樣,這裡的設計是完全遵照基本的佇列結構來的,所以算是通用的設計原理):

struct queue 

;typedef

struct queue t_queue;

void

q_initqueue

(t_queue *queue)

;int

q_additem

(t_queue *queue,

int item)

;int

q_isempty

(const t_queue queue)

;int

q_deleteitem

(t_queue *queue)

;int

q_count

(const t_queue queue)

;int

q_indexof

(const t_queue queue,

int item)

;void

q_printqueue

(const t_queue queue)

;

2、實現**
#define ok 1

#define error -1

#define fail -1

#define yes 1

#define no -1

#define dmax 100

void

q_initqueue

(t_queue *queue)

intq_isempty

(const t_queue queue)

return no;

}int

q_additem

(t_queue *queue,

int item)

queue->data[queue->tail]

= item;

queue->tail++

; queue->count++

;return ok;

}int

q_deleteitem

(t_queue *queue)

queue->head++

; queue->count--

;return ok;

}int

q_count

(const t_queue queue)

intq_indexof

(const t_queue queue,

int item)

}return no;

}void

q_printqueue

(const t_queue queue)

for(

int i = queue.head; i < queue.tail; i++

)printf

("\r\n");

}

雖然不想這麼直接貼**上來,但是其實也沒什麼好講的。

3、測試

t_queue queue;

q_initqueue

(&queue)

;q_additem

(&queue,12)

;q_additem

(&queue,6)

;q_additem

(&queue,8)

;q_additem

(&queue,0)

;q_additem

(&queue,9)

;q_additem

(&queue,-9

);q_additem

(&queue,

1023);

q_additem

(&queue,65)

;q_additem

(&queue,7)

;q_printqueue

(queue)

;q_deleteitem

(&queue)

;q_deleteitem

(&queue)

;q_printqueue

(queue)

;int index =

q_indexof

(queue,1)

;printf

("%d\n"

, index)

;index =

q_indexof

(queue,65)

;printf

("%d\n"

, index)

;index =

q_indexof

(queue,7)

;printf

("%d\n"

, index)

;printf

("the count is:%d\n"

,q_count

(queue));

return

0;

測試結果如下:

4、小結

下一章我將實現順序表和堆疊(棧,stack),因為順序表完全類似於陣列,所以我會使用節點+順序表這種方式來模擬整個陣列的操作方式。

資料結構單鏈表的基本操作(純c語言)

標頭檔案 ifndef slinklist h include include define eoe 1 typedef int elemtype typedef struct node node typedef node list list initilist list l list create...

資料結構 鍊錶(純c語言實現)

include include typedef struct nodelnode,linklist linklist greatlinklist int n return list 實現鍊錶的插入操作。1 前驅結點不用找,前驅結點是作為函式的引數的,用來搞清要插入的結點的位置。2 將前驅結點的指標域...

資料結構 串的基本操作c 實現

include include using namespace std define maxsize 20 void initstr struct stringsq p 初始化 intstrlength struct stringsq p 求字串的長度 void createstr struct s...