链队列-C语言版

源文件部分:  指针没学好的同学很难看懂^_^,有点乱,希望对大家有点帮助。
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<string.h>
typedef int Elemtype;
#include"LQueue.h"
int main()
{
	Deque head;
	instruction(head);
	return 0;
}
头文件部分:
typedef struct Queue
{
	Elemtype data;
	struct Queue *next;
}LQnode,*LQueue;

typedef struct
{
	LQnode *front;
	LQnode *rear;
}Deque;

void Init_queue(Deque *head)    //初始化+清空操作==其实这里的清空是指将头节点后的节点给丢弃掉
{
	LQnode *p=NULL;
	p=(LQueue)malloc(sizeof(LQnode));
	head->front=p;
	head->rear=p;
	p->next=NULL;
}

int Empty_queue(Deque *head)           //判空
{
	if(head->front->next==head->rear->next)
		return 1;
	return 0;
}

int Lenght_queue(Deque arrow)
{
	LQnode *p=NULL;
	int len=0;
	p=arrow.front->next;
	while(p)
	{
		len++;
		p=p->next;
	}
	return len;
}

void Enqueue(Deque *arrow,Elemtype e)       //入队操作
{
	LQueue p=NULL;
	p=(LQueue)malloc(sizeof(LQnode));
	if(!p)
	{
		printf("已无更多的内存单元得到分配!\n");
		return ;
	}
	p->data=e;
	p->next=NULL;                 //插入时,队首指针是不需要动的
	arrow->rear->next=p;
	arrow->rear=p;
	return ;
}

void Dequeue(Deque *arrow,Elemtype *e)       //出队操作
{
	LQnode *p=NULL;
	if(Empty_queue(arrow))
	{
		printf("当前链队列为空,无法完成出队操作!!!\n");
		return ;
	}
	p=arrow->front->next;
	(*e)=p->data;
	arrow->front->next=p->next;
	printf("元素%d已退出队列!!!\n",*e);
	if(Lenght_queue(*arrow)==0)
		return ;                       //当最后一个元素出列以后,arrow->rear不知道指向了哪里
	free(p);
	return ;
}

int Queue_top(Deque *arrow)   //返回队首元素
{
	if(Empty_queue(arrow))
	{
		printf("当前链队列为空,队首元素不存在!!!\n");
		return 0;
	}
	printf("当前队首元素是:%d\n",arrow->front->next->data);
}

void Destroy_queue(Deque *arrow)    //链队列的销毁
{
	LQnode *p=NULL;
	if(Empty_queue(arrow))
	{
		printf("当前链队列为空,无须完成销毁操作!!!\n");
		return ;
	}
	while(arrow->front->next)
	{
		p=arrow->front->next;
		arrow->front->next=p->next;
		if(Lenght_queue(*arrow)==0)
			break;
		free(p);
	}
	printf("销毁成功!\n");
	return ;
}

void Print_queue(Deque arrow)
{
	LQnode *p=NULL;
	p=arrow.front->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

void Modify_queue(Deque *arrow,Elemtype index,Elemtype e)    //修改函数
{
	int i=0;
	LQnode *p=NULL;
	p=arrow->front->next;
	while(i<index-1)
	{
		p=p->next;
	}
	p->data=e;
	printf("已完成修改操作!\n");
}

int Insearch_queue(Deque arrow,Elemtype e)           //查找函数
{
	LQnode *p=NULL;
	int i=1;
	if(Empty_queue(&arrow))
	{
		printf("当前链队列为空,没有元素可查找!!!\n");
		return 0;
	}
	p=arrow.front->next;
	while(p!=NULL)
	{
		if(e==p->data)
		{
			return i;
			break;
		}
		i++;
		p=p->next;
	}
	if(p==NULL)
		printf("查找失败,队列内无该元素存在!\n");
	return 0;
}

void instruction(Deque head)
{
	int n,m,t,a,b,len1,index;
	printf("\t\t1、队列初始化  \n");
	printf("\t\t2、新增队列元素\n");
	printf("\t\t3、返回队首元素\n");
	printf("\t\t4、元素出队列  \n");
	printf("\t\t5、查找队列元素\n");
	printf("\t\t6、修改队列元素\n");
	printf("\t\t7、销毁队列    \n");
	printf("\t\t8、队列的长度  \n");
	printf("\t\t9、打印队列元素\n");
	printf("\t\t10、退出程序    \n");
	printf("请输入你所需要完成的指令:\n");
	do{
		scanf("%d",&n);
		if(n<1||n>10)
			printf("对不起,你输入的指令编号是无效的,请重新输入!!!\n");
	}while(n<1||n>10);
	switch(n)
	{
		case 1:
			Init_queue(&head);
			printf("已完成链队列初始化,请输入你要添加的元素个数!\n");
			scanf("%d",&n);
			while(n--)
			{
				int x;
				scanf("%d",&x);
				Enqueue(&head,x);
			}
			printf("完成建队操作!\n");
			break;
		case 2:
			printf("请输入你要添加的元素个数!\n");
			scanf("%d",&n);
			while(n--)
			{
				int x;
				scanf("%d",&x);
				Enqueue(&head,x);
			}
			printf("增添成功!\n");
			break;
		case 3:
			Queue_top(&head);
			break;
		case 4:
			Dequeue(&head,&t);
			break;
		case 5:
			printf("请输入你所要查找的元素:\n");
			scanf("%d",&m);
			index=Insearch_queue(head,m);
			if(index)
				printf("你所要查找的元素位于队列的第%d个位置上!!!\n",index);
			break;
		case 6:
			printf("请输入你更改的元素队列位置:\n");
			do{
				scanf("%d",&a);
				if(a<1||a>Lenght_queue(head))
					printf("对不起,你所输入的元素位置不在区域内,请重新输入!!!\n");
			}while(a<1||a>Lenght_queue(head));
			printf("请输入修改后的值:\n");
			scanf("%d",&b);
			Modify_queue(&head,a,b);
			break;
		case 7:
			Destroy_queue(&head);
			break;
		case 8:
			len1=Lenght_queue(head);
			printf("当前链队列的长度为:%d\n",len1);
			break;
		case 9:
			Print_queue(head);
			break;
		case 10:
			return;
		default:
			instruction(head);
			break;
	}
	instruction(head);
}

时间: 2024-10-12 21:33:02

链队列-C语言版的相关文章

【小白成长撸】--链栈(C语言版)

1 // 链栈.cpp : 定义控制台应用程序的入口点. 2 // 3 4 #include "stdafx.h" 5 #include <stdio.h> 6 #include <stdlib.h>//malloc的头文件 7 8 typedef struct line_stack//栈包装 9 { 10 int x; 11 struct line_stack *next; 12 }link; 13 14 void pushes(link **top, int

链栈-C语言版

#include<stdio.h> #include<iostream> #include<stdlib.h> using namespace std; typedef struct stacknode                           ///结构节点的定义 { int data; struct stacknode *next; }StackNode,*LinkStack; int StackEmpty(LinkStack top)          

C语言 链队列基本操作

C语言链队列基本操作 #include <stdio.h> #include <stdlib.h> #include <malloc.h> /* C语言链队列基本操作 2014年7月11日10:11:41 */ typedef int qType; typedef struct node { qType data; struct node *pNext; }Node,*pNode; typedef struct queue { pNode front; pNode re

数据结构c语言版 队列

队列 (1)队列是一种先进先出的线性表 (2)只能从队头进行删除,从队尾进行插入 (一)链队列 (1)需要一个指向头结点的头指针和一个指向尾结点的尾指针 (2)通常为了操作的方便起见,都会给链队添加一个头结点,头结点不存数据. (3)有头结点的链队列判空的条件是头指针和尾指针都指向头结点 链队列的实现代码 1 #include<stdio.h> 2 #include<stdlib.h> 3 #define STACK_INIT_SIZE 100 4 #define STACKINC

数据结构 - 链队列的实行(C语言)

数据结构-链队列的实现 1 链队列的定义 队列的链式存储结构,其实就是线性表的单链表,只不过它只能尾进头出而已, 我们把它简称为链队列.为了操作上的方便,我们将队头指针指向链队列的头结点,而队尾指针指向终端结点,如下图所示. 空队列时,front和rear都指向头结点,如下图所示. 链队列的结构为: typedef int QElemType; /* QElemType类型根据实际情况而定,这里假设为int */ typedef struct QNode /* 结点结构 */ { QElemTy

用JS描述的数据结构及算法表示——栈和队列(基础版)

前言:找了上课时数据结构的教程来看,但是用的语言是c++,所以具体实现在网上搜大神的博客来看,我看到的大神们的博客都写得特别好,不止讲了最基本的思想和算法实现,更多的是侧重于实例运用,一边看一边在心里隐隐歌颂大神的厉害,然后别人的厉害不是我的,所以到底看得各种受打击+头昏脑涨,写这个系列是希望自己能够总结学到东一块.西一下的知识,因为水平有限+经验不足,所以在此只说最基础的思想,附上我自己的算法实现(肯定还有更优解),如果要想看进阶版的,可以在园里搜“数据结构”,各种语言实现和进阶提升的文章有很

Docker,用任何工具链和任何语言来构建任何应用

在看过Docker的两个Hello World的程序后,我们对Docker有了一个大概的感性的认识,那么Docker是到底是什么呢?Docker是一个面向开发者和系统管理员编译,装载,和运行分布式应用的开放式平台.它包括了Docker引擎,一个可移植的,轻量级的,运行时环境和打包工具,还包括了Docker Hub,一个用于共享应用和自动化工作流的云服务. Docker和一般的虚拟机有什么不同之处 对一般的虚拟机而言,每个虚拟化的应用包括的不仅仅是这个应用本身(大概数十M)以及应用所必需的bin文

C语言版数据结构算法

C语言版数据结构算法 C语言数据结构具体算法 https://pan.baidu.com/s/19oLoEVqV1I4UxW7D7SlwnQ C语言数据结构演示软件 https://pan.baidu.com/s/1u8YW897MjJkoOfsbHuadFQ 在上一篇的FIFO中就是基于数据结构思维中的队列实现的,而基本的数据结构内容还有 算法效率分析.线性表.栈和队列.串.数组和广义表.树和二叉树.图.查表.排序.动态存储管理 上面两个链接就是<数据结构(C语言版)>严蔚敏教授严奶奶的书籍

链队列代码及应用

链队列代码 #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <time.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define TRUE 1 #define FALSE 0 typedef int Status; typedef int ElemType; typedef struct Qnode{ int