双链表优先队列ADT的实现与测试

源代码如下:

#include <stdlib.h>
#include <stdio.h>
typedef struct pq* PQ;
typedef struct PQnode* PQlink;
struct Item{int data;char c;};
struct PQnode{Item key;PQlink prev,next;};
struct pq{PQlink head,tail;};

PQ PQinit(){
	PQ pq = (PQ)malloc(sizeof*pq);
	PQlink h = (PQlink)malloc(sizeof*h),
			t = (PQlink)malloc(sizeof*t);
	h->prev = t; h->next = t;
	t->next = h; t->prev = h;   //头尾指针不存放数据
	pq->head = h; pq->tail = t;
	return pq;
}

int PQempty(PQ pq){
	return pq->head->next->next == pq->head;
}

PQlink PQinsert(PQ pq, Item v){
	PQlink t = (PQlink)malloc(sizeof *t);
	//设置节点t的相关信息
	t->key = v;t->next=pq->head->next;t->prev=pq->head;
	//维护双链表
	t->next->prev=t;pq->head->next = t;
	return t;
}

Item PQdelmax(PQ pq){
	Item max;struct PQnode *t,*x=pq->head->next;
	for(t=x; t->next!=pq->head;t=t->next)
		if(t->key.data>x->key.data) x = t;
	max =x->key;
	//维护双链表
	x->next->prev=x->prev;x->prev->next=x->next;
	free(x);return max;
}

void PQchange(PQ pq, PQlink x, Item v){
	x->key=v;
}

void PQdelete(PQ pq, PQlink x){
	x->next->prev=x->prev;x->prev->next=x->next;
	free(x);
}

//并不破坏b的结构??!!(<span style="color:#ff0000;">求答疑</span>) 将b队列追加在a尾处
void PQjoin(PQ a, PQ b){
	a->tail->prev->next = b->head->next;
	b->head->next->prev = a->tail->prev;
	a->head->prev = b->tail;
	b->tail->next = a->head;
	free(a->tail);free(b->head);
}

void test(){
	PQ pq = PQinit();
	PQ pq2 = PQinit();
	Item a = {2,'a'};
	Item b = {3,'b'};
	Item c = {1,'c'};
	PQinsert(pq,a);PQinsert(pq2,b);PQinsert(pq2,c);
	printf("%d %d \n",pq2->head->next->key.data,pq2->head->next->next->key.data);
	PQjoin(pq,pq2); //
	printf("%d %d \n",pq2->head->next->key.data,pq2->head->next->next->key.data);
	Item d = {21,'d'};
	PQchange(pq,pq->head->next,d);
	PQdelete(pq,pq->head->next->next);
	while(!PQempty(pq)){
		printf("%d \n",PQdelmax(pq).data);
	}
}

main(){
	test();
}

运行结果

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-07-30 13:50:46

双链表优先队列ADT的实现与测试的相关文章

线性表—双链表

1.基础知识 a.双链表结点的结构:其由前序元素地址,数据域,后继元素地址组成. b.双链表结点的连接方法:先声明该结点,可以在内部也可以利用其特性来表明前序结点和后继结点是什么,之后同时还需要说明"其前序结点的后继地址为该结点"和"其后继结点的前序地址为该结点.(本质:双向) 2.循环双链表的实现 线性表接口LList package com.clarck.datastructure.dlinked; /*** 线性表接口LList,描述线性表抽象数据类型,泛型参数T表示数

双链表&amp;链表合并&amp;多项式相加算法

//单链表的合并 //链表合并 //两个链表必须是有序的 #define Maxsize 5 typedef  int elemtype; typedef struct linklist { elemtype data; struct linklist *next; }Linklist; //建立链表1 Linklist *CreateList1 () { int i,data ; Linklist *head, *p, *q; head=p=(Linklist  *)malloc(sizeof

【c++版数据结构】之双链表的实现(带头结点以及尾节点)

所实现的双链表的结构如下图所示: 双链表的实现,和第一篇文章单链表的实现大致相同点击打开链接 本篇文章在构建节点的同时,初始化构建节点的前驱和后继,具体细节参考下列代码 头文件:DList.h #ifndef DLIST_H_ #define DLIST_H_ typedef enum{FALSE,TRUE}Status; #include<iostream> #include<cassert> using namespace std; template<class Type

java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制)

转载请注明出处(请尊重原创!谢谢~): http://blog.csdn.net/javazejian/article/details/53073995 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) ??这篇是数据结构与算法的第3篇,通过前两篇的介绍,对应顺序表和链表已有

数据结构之自建算法库——循环双链表

本文针对数据结构基础系列网络课程(2):线性表中第13课时循环链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:cdlinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef CDLINKLIST_H_INCLUDED #define CDLINKLIST_H_INCLUDED //循环双链表基本运算函数 typedef int E

【Weiss】【第03章】双链表例程

双链表因为多了个前向指针,需要考虑的特殊因素多了一倍 所以中间插入(这儿没写)和中间删除会比较复杂. 其它倒没什么特别的,代码如下. 测试代码 1 #include <iostream> 2 #include "double_linklist.cpp" 3 using namespace std; 4 using namespace doublelinklist; 5 template class DList<int>; 6 int main(void) 7 {

基于双链表 实现Java Queue队列

除了可以通过一维数组,单链表实现queue队列,还可以通过双链表实现queue队列. 在基于NLNode类实现双向链表的时候,为了使编程更加简洁,通常我们都要在最前端和最后端各设置一个哑元节点( Dummy node ).这两个节点分别称作头节点( Header node )和尾节点( Trailer node) ㈠,起哨兵( Sentinel)的作用.也就是说,它们并不存储任何实质的数据对象,头(尾)节点的next( prev)引用指向首(末)节点,而prev(next)引用为空.如此构成的双

数据结构之自建算法库——双链表

本文针对数据结构基础系列网络课程(2):线性表中第12课时双链表. 按照"0207将算法变程序"[视频]部分建议的方法,建设自己的专业基础设施算法库. 双链表算法库算法库采用程序的多文件组织形式,包括两个文件: 1.头文件:dlinklist.h,包含定义双链表数据结构的代码.宏定义.要实现算法的函数的声明: #ifndef DLINKLIST_H_INCLUDED #define DLINKLIST_H_INCLUDED typedef int ElemType; typedef s

数据结构实践——循环双链表应用

本文针对数据结构基础系列网络课程(2):线性表的实践项目. [项目- 循环双链表应用] 设非空线性表ha和hb都用带头节点的循环双链表表示.设计一个算法Insert(ha,hb,i).其功能是:i=0时,将线性表hb插入到线性表ha的最前面:当i>0时,将线性表hb插入到线性表ha中第i个节点的后面:当i大于等于线性表ha的长度时,将线性表hb插入到线性表ha的最后面. 请在实现算法时,除项目中给出的特殊要求,其余工作均可利用项目4完成的算法支持. [参考解答](循环双链表的基本运算算法,请参考