【数据结构】队列的 增,删,查,改 的实现

#include <iostream>

using namespace std;

int main()
{
	/*队列的实现不同于栈,根据队列自身的特点,
	单链表是最适合用于队列的,
	因为如果是数组实现队列,
	在队列进行“头出”的时候需要整体元素向前移动,
	造成效率较低。*/

	typedef int QueueDataType;
	typedef struct QueueNode
	{
		QueueDataType data;
		struct QueueNode *next;
	}QueueNode;

	/*注意:
	因为这是单链表,
	如果想要获得尾指针就得从头指针开始遍历,
	而队列不像单链表一样需要遍历整个链表,
	它的整体操作均与队头,队尾有关,
	所以我们可以将这二者(头指针,尾指针)进行封装,
	需要时直接访问,
	而无需多次遍历。*/
	typedef struct Queue
	{
		struct Queue *head;//定义一个头指针
		struct Queue *tail;//定义一个尾指针
	}Queue;

	//初始化队列:
	void QueueInit(Queue *q)//注意这里形参的类型是Queue而不是QueueNode
	{
		assert(p);

		q->head = NULL;
		q->tail = NULL;
	}

	//入队列操作函数:
	void QueuePush(Queue *p,QueueDataType x)
	{
		assert(p);

		QueueNode *newnode = (QueueNode *)malloc(sizeof(QueueNode));
		if (newnode == NULL)
		{
			cout << "malloc is fail" << endl;
			exit(-1);
		}

		//先将新结点内的值根据题目要求赋值
		newnode->data = x;
		newnode->next = NULL;
        
		//入队列的操作要考虑此时的单链表是否为空表
		if (p->tail == NULL)
		{
			p->head = p->tail = newnode;
		}
		else
		{
			p->tail->next = newnode;//如果不进行判空,则指针p去访问NULL则会使程序无法运行
			p->tail = newnode;
		}
		
	}

	//出队列操作函数:
	/*出队列操作必须要求链表非空*/
	void QueuePop(Queue *p)
	{
		assert(p);
		assert(!QueueEmpty(p));
		
		QueueNode *tmp = p->head; /*这部分代码无需对结点个数大于1个进行判断,
									  因为当结点个数为1时,
									  这部分代码的 p->head 即为 NULL*/

		p->head = tmp->next;//如果队列为空表,此时就是对NULL进行解引用,则会造成程序崩溃
		free(tmp);
		tmp = NULL;		
		
	}

	//取出队头的数据:
	QueueDataType QueueFront(Queue *p)
	{
		assert(p);
		assert(!QueueEmpty(p));//取队头数据的前提是链表非空
		
		return p->head->data;//如果队列为空表,此时就是对NULL进行解引用,则会造成程序崩溃
	}

	//取出队尾的数据:
	QueueDataType QueueBack(Queue *p)
	{
		assert(p);
		assert(!QueueEmpty(p));//同理,取队尾数据的前提也是链表非空

		return p->tail->data;//如果队列为空表,此时就是对NULL进行解引用,则会造成程序崩溃
	}

	//判断队列是否为空
	bool QueueEmpty(Queue *p)
	{
		assert(p);

		return p->head == NULL;//判断第一个结点的地址是否为NULL
	}

	//获取队列中结点的个数
	int QueueSize(Queue *p)
	{
		int num = 0;
		QueueNode *cur = p->head;
		//while (cur != p->tail)//该行代码是错误的,因为它不能完整的进行遍历
		while (cur != NULL)
		{
			num++;
			cur = cur->next;
		}

		return num;
	}

	//队列的销毁
	void QueueDestroy(Queue *p)
	{
		assert(p);
		QueueNode *cur = p->head;
		while (cur)
		{
			QueueNode *tmp = cur->next;
			free(cur);
			cur = tmp;
		}

		//不要忘了最后要将头指针与尾指针全部置为 NULL
		p->head = p->tail = NULL;
	}

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
链式队列、栈和表通常是在数据结构课程中讨论的基本概念。它们都是线性数据结构,但在操作上略有不同: 1. **队列**(Queue)是一种先进先出(FIFO,First In First Out)的数据结构,类似于现实生活中的排队。常见的链式队列实现通常是通过两个指针,一个指向当前元素(头),另一个指向下一个将要入队的位置(尾)。以下是Python中链式队列的简单实现: ```python class Node: def __init__(self, data=None): self.data = data self.next = None class LinkedListQueue: def __init__(self): self.front = None self.rear = None # 添加元素到队尾 def enqueue(self, data): new_node = Node(data) if not self.rear: self.front = self.rear = new_node else: self.rear.next = new_node self.rear = new_node # 除并返回队首元素 def dequeue(self): if not self.front: return None temp_data = self.front.data self.front = self.front.next if not self.front: self.rear = None return temp_data ``` 2. **栈**(Stack)是一种后进先出(LIFO,Last In First Out)的数据结构,像一层层书叠起来一样。链式栈一般只有一个指针,表示栈顶。Python的列表可以轻松模拟栈: ```python class Stack: def __init__(self): self.stack = [] # 入栈 def push(self, item): self.stack.append(item) # 出栈 def pop(self): if not self.is_empty(): return self.stack.pop() else: return None # 判断是否为空 def is_empty(self): return len(self.stack) == 0 ``` 3. **表**(Table 或者也叫矩阵)是一维或多维的数据结构,用于存储元素对,每个位置对应一对值。在链表实现二维数组可能不太常见,但如果要用动态内存分配,可以类似下面这样创建节点,然后关联起来: ```python class TableNode: def __init__(self, row, col, value=None): self.row = row self.col = col self.value = value self.next = None class LinkedTable: def __init__(self, rows, cols): self.rows = rows self.cols = cols self.head = None # 二维插入和读取 def insert(self, row, col, value): if (row < 0 or row >= self.rows) or (col < 0 or col >= self.cols): raise IndexError("Invalid coordinates") node = TableNode(row, col, value) if not self.head: self.head = node else: cur_node = self.head while cur_node.next: cur_node = cur_node.next cur_node.next = node def get(self, row, col): if (row < 0 or row >= self.rows) or (col < 0 or col >= self.cols): return None cur_node = self.head for _ in range(row): cur_node = cur_node.next return cur_node.value if cur_node else None ``` **
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值