队列的定义与操作-顺序存储
typedef int Position;
typedef int ElementType;
struct QNode
{
ElementType *Data;
Position front,rear;
int MAXSIZE;
};
typedef struct QNode *Queue;
Queue CreateQueue(int MAXSIZE)
{
Queue Q=(Queue)malloc(sizeof(QNode));
Q->Data=(ElementType*)malloc(MAXSIZE*sizeof(ElementType));
Q->front=Q->rear=0;
Q->MAXSIZE=MAXSIZE;
return Q;
}
bool IsFull(Queue Q)
{
return ((Q->rear)+1)%Q->MAXSIZE==Q->front;
}
bool AddQ(ElementType X,Queue Q)
{
if(IsFull(Q))
{
printf("队列已满");
return false;
}
else
{
Q->rear=((Q->rear)+1)%Q->MAXSIZE;
Q->Data[Q->rear]=X;
return true;
}
}
bool IsEmpty(Queue Q)
{
return (Q->front==Q->rear);
}
#define Error -1
ElementType DeleteQ(Queue Q)
{
if(IsEmpty(Q))
{
printf("队列为空");
return Error;
}
else
{
Q->front=((Q->front)+1)%Q->MAXSIZE;
return Q->Data[Q->front];
}
}
int main()
{
}
ElementType *Data;/ 存储元素的数组 */,emmmm,用指针指向申请数组的首节点,说实话…我一般不会这么写,长知识了。
队列的定义与操作-链式存储
#include<iostream>
#include<malloc.h>
using namespace std;
typedef int ElementType;
typedef struct Node *PtrToNode;/* 队列中的结点 */
struct Node
{
ElementType Data;
PtrToNode Next;
};
typedef PtrToNode Position;
typedef struct QNode *Queue;
struct QNode
{
Position front,rear;/* 队列的头、尾指针 */
int MAXSIZE;/* 队列最大容量 */
};
bool IsEmpty(Queue Q)
{
return (Q->front==NULL);
}
#define Error -1
ElementType DeleteQ(Queue Q)
{
Position FrontCell;
ElementType FrontElem;
if(IsEmpty(Q))
{
printf("队列为空");
return Error;
}
else
{
FrontCell=Q->front;
if(Q->front==Q->rear)/* 若队列只有一个元素 */
Q->front=Q->rear=NULL;/* 删除后队列置为空 */
else
Q->front=FrontCell->Next;
FrontElem=FrontCell->Data;
free(FrontCell);/* 释放被删除结点空间 */
return FrontElem;
}
}
bool AddQ(Queue Q,ElementType X)
{
Position P=(Position)malloc(sizeof(Node));
P->Data=X;
P->Next=NULL;
Q->rear->Next=P;
Q->rear=P;
return true;
}
int main()
{
}
删除节点时判断队列是否只有一个元素的情况可能容易漏掉。
单项链表实现多项式加法运算
#include<iostream>
#include<malloc.h>
#include<math.h>
using namespace std;
typedef struct PolyNode *Polynomial;
struct PolyNode
{
int coef;//系数
int expon;//指数
Polynomial link;//指向下一个节点的指针
};
Polynomial P1,P2;
void Attach(int c,int e,Polynomial rear)
{
Polynomial P;
P=(Polynomial)malloc(sizeof(PolyNode));//申请新节点
P->coef=c;//对新节点赋值
P->expon=e;
P->link=NULL;
rear=P;//修改rear的值
rear->link=P; //将P指向的新节点插入到当前结果表达式尾项的后面
}
int Compare(int p1,int p2)
{
if(p1>p2)
return 1;
else if(p1<p2)
return -1;
else
return 0;
}
Polynomial PolyAdd(Polynomial P1,Polynomial P2)
{
Polynomial front,rear,temp;
int sum;
rear=(Polynomial)malloc(sizeof(PolyNode));//为方便表头插入,先产生一个临时空结点作为结果多项式链表头
front=rear;//由front记录结果多项式链表头结点
while(P1&&P2)
{
switch(Compare(P1->expon,P2->expon))
{
case 1://P1中的数据项指数较大
{
Attach(P1->coef,P1->expon,rear);
P1=P1->link;
break;
}
case -1://P2中的数据项指数较大
{
Attach(P2->coef,P2->expon,rear);
P2=P2->link;
break;
}
case 0://两数据项指数相等
{
sum=P1->coef+P2->coef;
if(sum) Attach(sum,P1->expon,rear);//注意判断系数和是否为0
P1=P1->link;
P2=P2->link;
break;
}
}
}
//将未处理完的另一个多项式的所有节点依次复制到结果多项式中去
for(;P1;P1=P1->link)Attach(P1->coef,P1->expon,rear);
for(;P2;P2=P2->link)Attach(P2->coef,P2->expon,rear);
temp=front;
rear->link=NULL;
front=front->link;//令front指向结果多项式第一个非零项
free(temp);//释放临时空表头节点
return front;
}
int main()
{
}
Attach()里面的第三个参数Polynomial rear还是不清楚这么用对不对… 老师给的代码是Polynomial *rear。
调用的语句是(*rear)->link=P;*rear=P;
我的语句是rear=P;rear->link=P;
…我觉得达到的效果是一样的,改天再看看,代码可能要修改。
今天真的是摸鱼的一天啊,下午睡了好久。
PS:嗯…搞清楚了,果然还是要用Polynomial *rear,因为在Attach()函数中,rear的值要被修改,而第一种的值传递显然是不可以的,所以要使用指针传递保证rear每次指向的都是最近更新的最后一个结点。
附上改正后的代码
#include<iostream>
#include<malloc.h>
#include<math.h>
using namespace std;
typedef struct PolyNode *Polynomial;
struct PolyNode
{
int coef;//系数
int expon;//指数
Polynomial link;//指向下一个节点的指针
};
Polynomial P1,P2;
void Attach(int c,int e,Polynomial *prear)
{
Polynomial P;
P=(Polynomial)malloc(sizeof(PolyNode));//申请新节点
P->coef=c;//对新节点赋值
P->expon=e;
P->link=NULL;
*prear=P;//修改rear的值
(*prear)->link=P; //将P指向的新节点插入到当前结果表达式尾项的后面
}
int Compare(int p1,int p2)
{
if(p1>p2)
return 1;
else if(p1<p2)
return -1;
else
return 0;
}
Polynomial PolyAdd(Polynomial P1,Polynomial P2)
{
Polynomial front,rear,temp;
int sum;
rear=(Polynomial)malloc(sizeof(PolyNode));//为方便表头插入,先产生一个临时空结点作为结果多项式链表头
front=rear;//由front记录结果多项式链表头结点
while(P1&&P2)
{
switch(Compare(P1->expon,P2->expon))
{
case 1://P1中的数据项指数较大
{
Attach(P1->coef,P1->expon,&rear);
P1=P1->link;
break;
}
case -1://P2中的数据项指数较大
{
Attach(P2->coef,P2->expon,&rear);
P2=P2->link;
break;
}
case 0://两数据项指数相等
{
sum=P1->coef+P2->coef;
if(sum) Attach(sum,P1->expon,&rear);//注意判断系数和是否为0
P1=P1->link;
P2=P2->link;
break;
}
}
}
//将未处理完的另一个多项式的所有节点依次复制到结果多项式中去
for(;P1;P1=P1->link)Attach(P1->coef,P1->expon,&rear);
for(;P2;P2=P2->link)Attach(P2->coef,P2->expon,&rear);
temp=front;
rear->link=NULL;
front=front->link;//令front指向结果多项式第一个非零项
free(temp);//释放临时空表头节点
return front;
}
int main()
{
}