C语言数据结构--队列 基本操作代码合集

概述

三段代码分别是队列的顺序存储,带头结点的链式存储队列,不带头结点的链式存储队列。

都包括着初始化、判空、入队 、创建、出队、遍历操作,三段代码都是键入9999即输入结束,方便大家调试。

队列的顺序存储

#include<stdio.h>
#include<stdlib.h>
# define MaxSize 50
typedef struct{
	int data[MaxSize];
	int front,rear;
}SqQueue;

void InitQueue(SqQueue &Q)
{
	Q.front = Q.rear = 0;
 } 

bool QueueEmpty(SqQueue Q)   //牺牲一个单元来判空 
{
	if(Q.front == Q.rear)
	   return true;
	else
	   return false;
 } 
 
 bool EnQueue(SqQueue &Q,int x)
 {
 	if((Q.rear+1)%MaxSize==Q.front)    //牺牲一个单元格来区分队空和队满 
 	    return false;
 	Q.data[Q.rear] = x;
 	Q.rear=(Q.rear + 1)%MaxSize;

	 return true; 
 }
 
void CreateQueue(SqQueue &Q)
 {
 	int x = 0;
 	scanf("%d",&x);
 	while(x!=9999)
 	{
 		EnQueue(Q,x);
 		scanf("%d",&x);
	 }
  } 
 bool DeQueue(SqQueue &Q,int &x)
 {
 	if(Q.front == Q.rear)      //判断队空 
 	  return false;
 	x=Q.data[Q.front];
 	printf("%d已出队\n",x); 
 	Q.front = (Q.front + 1)%MaxSize;
 	return true;
 }
 bool GetTop(SqQueue Q,int &x)    //读取队首元素 
 {
 	if(Q.front == Q.rear)      //判断队空 
 	  return false;
 	x=Q.data[Q.front];
 	printf("队首元素为%d\n");
 }
 void Print(SqQueue Q)
 {
 	 while(Q.front!=Q.rear)
 	 {
 	 	printf("%d ",Q.data[Q.front]);
 	 	Q.front = (Q.front + 1)%MaxSize;
	  }
 }
 int main()
 {
 	SqQueue Q;
 	int x = 0;
 	InitQueue(Q);        //初始化 
 	CreateQueue(Q);      //创建 
 	EnQueue(Q,666);      //666入队 
 	DeQueue(Q,x);        //出队 
 	Print(Q);            //遍历 
 	return 0;
 }

带头结点的链式存储队列

#include<stdio.h>
#include<stdlib.h>
typedef struct LinkNode{        //链式队列结点 
	int data;
	struct LinkNode *next;
}LinkNode;
typedef struct{                   //链式队列 
	LinkNode *front,*rear;        //队列的队头和队尾指针 
}LinkQueue;

void InitQueue(LinkQueue &Q)
{
	Q.front = Q.rear = (LinkNode *)malloc(sizeof(LinkNode));
	Q.front->next = NULL;
 } 
 bool QueueEmpty(LinkQueue Q)             //判空 
 {
 	if(Q.front == Q.rear )
 	    return true;
 	else
 	    return false;
 }
 void EnQueue(LinkQueue &Q,int x)           //进队 
 {
 	LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
 	s->data = x;
	s->next =NULL;
	Q.rear->next = s;
	Q.rear = s;            //修改尾指针 
 }
 void CreateQueue(LinkQueue &Q)            //创建队 
 {
 	int x = 0;
 	scanf("%d",&x);
 	while(x!=9999)
 	{
 		EnQueue(Q,x);
 		scanf("%d",&x);
	 }
  } 
 bool DeQueue(LinkQueue &Q,int &x)         //出队 
 {
 	if(Q.front == Q.rear)
 	  return false;
 	  LinkNode *D=Q.front->next ;
 	x=D->data;
 	Q.front->next =D->next ;
 	if(Q.rear == D)
 	   Q.rear=Q.front;    //只剩一个元素,删除后变空 
 	free(D);
 	return true;
  } 
  
bool GetTop(LinkQueue Q,int &x)     //读取队首元素,并用x返回 
{
	if(Q.front->next == NULL)
	  return false;
	x=Q.front->next->data ;
	printf("\n队首元素值为:%d\n",x);
	return true; 
}
void Print(LinkQueue Q)                 //遍历 Q 
  {
  	LinkNode *p=Q.front->next ;
  	while(p != Q.rear )
  	{
  		printf("%d ",p->data);
  		p=p->next ;
	  }
	  printf("%d ",Q.rear->data);
  }
  int main()
  {
  	int x = 0;
  	int A = 0;
  	LinkQueue Q;             //声明 
  	InitQueue(Q);            //初始化 
  	CreateQueue(Q);          //创建 
  	EnQueue(Q,666);          //666入队 
  	DeQueue(Q,x);            //出队 
  	Print(Q);                //遍历 
  	GetTop(Q,A);             //读取队首元素 
  	return 0;
   } 

不带头结点的链式存储队列

#include<stdio.h>
#include<stdlib.h>

typedef struct LinkNode{
	int data;
	struct LinkNode *next;
}LinkNode;
typedef struct{
	LinkNode *front,*rear;
}LinkQueue;

void InitQueue(LinkQueue &Q)    //不带头结点的初始化 
{
	Q.front = Q.rear = NULL;
 } 
 
bool QueueEmpty(LinkQueue Q)          //判空 
 {
 	if(Q.front == Q.rear && Q.front==NULL)
 	  return true;
 	else
 	  return false;
 }
 void EnQueue(LinkQueue &Q,int x)        //入队,注意两种情况 
 {
 	if(Q.front == Q.rear && Q.front ==NULL)
 	{
 	   LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
 	   s->data = x;
 	   Q.front = Q.rear = s;
	 }
	 else
	 {
	 	LinkNode *s=(LinkNode *)malloc(sizeof(LinkNode));
	 	s->data = x;
	 	Q.rear->next = s;
	 	Q.rear = s;
	 	Q.rear->next=NULL;
	 }
  } 
void CreateQueue(LinkQueue &Q)
{
	int x = 0;
	scanf("%d",&x);
	while(x!=9999)
	{
		EnQueue(Q,x);
		scanf("%d",&x);
	}
}
bool DeQueue(LinkQueue &Q,int &x)
{
	if(Q.front == Q.rear && Q.front == NULL)
	   return false;
	x=Q.front->data ;
	printf("\n%d已出队\n",x);
	if(Q.front==Q.rear)
      {
      		  Q.front = Q.rear = NULL;
              return true;
	  }
	else
      {
      		Q.front=Q.front->next ;
            return true;
	  }	
}
bool GetTop(LinkQueue Q,int &x)
{
	if(Q.front == Q.rear && Q.front == NULL)
	   return false;
	x=Q.front->data ;
	printf("队首元素为%d\n",x);
	return true;
}
void Print(LinkQueue Q)
{
	LinkNode *h=Q.front ;
	while(h!= Q.rear )
	{
		printf("%d ",h->data);
		h = h->next ;
	}
	printf("%d ",Q.rear->data);
}
int main()
{
	int x = 0;
	int A = 0;
	LinkQueue Q;       //声明 
	InitQueue(Q);      //初始化 
	CreateQueue(Q);    //创建 
	EnQueue(Q,666);    //666入队 
	DeQueue(Q,x);      //出队 
	GetTop(Q,A);       //获取队首元素 
	Print(Q);          //遍历 
	return 0;
}

  • 16
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
#include #include #include //队列最大长度 #define MAX_QUEUE 1024 //偷懒,就用静态队列了 static int mQueue[MAX_QUEUE]; //队列插入 void InsertData(int **Front, int **Rear) { if (*Rear + 1 == *Front && (*Rear + 1 - MAX_QUEUE != *Front)) { //当队列数据已满,返回 puts("Queue Size Overflow!\n"); return; } else if (*Rear - mQueue > MAX_QUEUE) { //实现的是类似循环队列,但由于是静态线性队列(数组) //而不是用链表来实现的,所以到静态队列(数组)尾部,尾指针自动指向(数组)头部 *Rear = mQueue; } puts("Input Data:"); scanf("%d", *Rear); //输入数据后,尾指针后移 *Rear += 1; } //从头指针删除一个队列中的数据 void DeleteData(int **Front, int **Rear) { if (*Front == *Rear) { //头指针尾指针重合,队列空,不能删除,返回 puts("Queue Empty!\n"); return; } else if (*Front - mQueue > MAX_QUEUE) { //参考 Rear *Front = mQueue; } //从头指针删除一个数据 *Front += 1; } //显示队列数据 void ShowData(int **Front, int **Rear) { int *temp; for (temp=*Front; temp!=*Rear; temp++) { printf("%d --> ", *temp); } puts("\n"); } void usage(void) { puts("1. Insert Data"); puts("2. Delete Data"); puts("3. Show Data"); } int main(int argc, char **argv) { //头指针,尾指针 //队列的一个特性 First in first out FIFO int *pFront, *pRear; int op_code; //初始化队列,头指针和尾指针此时指向的地址相同 pFront = pRear = mQueue; while (1) { usage(); scanf("%d", &op_code); switch (op_code) { case 1: printf("%p\n", pFront); printf("%d\n", *pFront); InsertData(&pFront, &pRear); break; case 2: DeleteData(&pFront, &pRear); break; case 3: ShowData(&pFront, &pRear); break; default: break; } } return 0; }
### 回答1: 树(Tree)是一种非线性的数据结构,它由n(n>=0)个结点构成,其中一个结点为根结点,其余结点可分为m(m>=0)个互不相交的子集T1、T2、……、Tm,其中每一个子集本身又是一棵树,并称为根的子树。树的特点是:每个结点有零个或多个子结点;没有父结点的结点称为根结点;每一个非根结点有且只有一个父结点;除了根结点之外,每个子结点可以分为多个不相交的子树。 下面是一个基本的树的结构定义: ```c // 树的结构体定义 typedef struct TreeNode { int data; // 数据域 struct TreeNode *firstChild;// 第一个子节点 struct TreeNode *nextSibling;// 兄弟节点 }TreeNode, *Tree; ``` 其中,data表示结点的数据域,firstChild指向该结点的第一个子节点,nextSibling指向该结点的下一个兄弟节点。 下面是一个创建树的函数: ```c // 创建树 Tree createTree(int data) { Tree root = (Tree)malloc(sizeof(TreeNode)); root->data = data; root->firstChild = NULL; root->nextSibling = NULL; return root; } ``` 下面是一个向树中添加子节点的函数: ```c // 添加子节点 void addChild(Tree parent, int data) { Tree child = (Tree)malloc(sizeof(TreeNode)); child->data = data; child->firstChild = NULL; child->nextSibling = NULL; if (parent->firstChild == NULL) parent->firstChild = child; else { Tree p = parent->firstChild; while (p->nextSibling != NULL) p = p->nextSibling; p->nextSibling = child; } } ``` 下面是一个先序遍历树的函数: ```c // 先序遍历树 void preOrderTraversal(Tree root) { if (root != NULL) { printf("%d ", root->data); preOrderTraversal(root->firstChild); preOrderTraversal(root->nextSibling); } } ``` 下面是一个后序遍历树的函数: ```c // 后序遍历树 void postOrderTraversal(Tree root) { if (root != NULL) { postOrderTraversal(root->firstChild); postOrderTraversal(root->nextSibling); printf("%d ", root->data); } } ``` 下面是一个层次遍历树的函数: ```c // 层次遍历树 void levelOrderTraversal(Tree root) { Queue q; initQueue(&q); if (root != NULL) { enQueue(&q, root); while (!isQueueEmpty(&q)) { Tree p = deQueue(&q); printf("%d ", p->data); if (p->firstChild != NULL) enQueue(&q, p->firstChild); if (p->nextSibling != NULL) enQueue(&q, p->nextSibling); } } } ``` 其中,Queue是一个队列结构体。 以上就是一个简单的树的实现。 ### 回答2: 树是一种常见的数据结构,用于存储具有层次关系的数据。它由节点和边组成,通常包含一个根节点和若干子节点。 在C语言中,我们可以使用结构体来定义树的节点。一个最基本的树节点结构体可能包含两个成员变量:数据和指向子节点的指针。例如: ``` typedef struct TreeNode { int data; struct TreeNode* left; struct TreeNode* right; } TreeNode; ``` 上述代码定义了一个名为TreeNode的结构体,它包含一个整型数据成员和两个指向左子节点和右子节点的指针。 为了方便操作树,我们可以定义一些基本的函数。其中,创建节点的函数可以使用动态内存分配来分配新节点的内存空间。例如: ``` TreeNode* createNode(int data) { TreeNode* newNode = (TreeNode*)malloc(sizeof(TreeNode)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } ``` 我们还可以定义插入节点、删除节点、搜索节点等函数来操作树的结构。 除此之外,还可以实现一些遍历树的算法,如先序遍历、中序遍历和后序遍历。这些遍历方法可以递归地遍历树的节点,并对节点进行指定的操作。 编写树的操作函数时,需要考虑到不同树的特点,例如二叉搜索树要保持左子节点的值小于根节点,右子节点的值大于根节点。 总之,编写一个经典C语言数据结构-树需要定义树节点的结构体,实现节点的创建、插入、删除和搜索等操作函数,同时可以实现遍历树的算法。 ### 回答3: 树是一种经典的数据结构C语言可以很方便地实现树的相关操作。首先,我们可以定义一个树的节点结构体: ```c typedef struct Node { int data; // 节点存储的数据 struct Node* left; // 左子树指针 struct Node* right; // 右子树指针 } Node; ``` 接下来,我们可以实现一些树的基本操作,例如创建树、插入节点、删除节点和遍历。下面是一个简单的示例: ```c // 创建一个节点 Node* createNode(int data) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->left = NULL; newNode->right = NULL; return newNode; } // 在树中插入一个节点 Node* insertNode(Node* root, int data) { if (root == NULL) { return createNode(data); } else if (data < root->data) { root->left = insertNode(root->left, data); } else if (data > root->data) { root->right = insertNode(root->right, data); } return root; } // 在树中删除一个节点 Node* deleteNode(Node* root, int data) { if (root == NULL) { return root; } else if (data < root->data) { root->left = deleteNode(root->left, data); } else if (data > root->data) { root->right = deleteNode(root->right, data); } else { if (root->left == NULL) { Node* temp = root->right; free(root); return temp; } else if (root->right == NULL) { Node* temp = root->left; free(root); return temp; } Node* temp = findMinNode(root->right); root->data = temp->data; root->right = deleteNode(root->right, temp->data); } return root; } // 遍历树:前序遍历(中-左-右) void preOrderTraversal(Node* root) { if (root != NULL) { printf("%d ", root->data); preOrderTraversal(root->left); preOrderTraversal(root->right); } } ``` 这只是树的基本实现,树还有很多其他操作,例如查找节点、判断树是否为空、计算树的高度等。可以根据具体需求进行扩展。通过以上实现,我们可以使用经典的C语言来构建和操作树结构。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值