陈越《数据结构》第二章 线性结构
2.1 线性表2.1.1 基本知识例1:一元多项式及其运算
。
解析:
A) char *(*fun1)(char *p1,char *p2);
B) char **fun2(char *p1,char *p2);
C) char *fun3(char *p1,char *p2);
2.1.2 顺序存储
2.1.3 链式存储
。
2.1.4 广义表和多重链表2.1.4.1 广义表2.1.4.2 多重链表
2.2 堆栈2.2.1堆栈定义和堆栈的抽象数据类型例1:中缀表达式
例2:如果 三 个字符 按
2.2.2 顺序存储例3:请用一个数组实现两个堆栈,要求最大地利用数组空间,使数组只要有空间入栈操作就可以成功。
2.2.3 堆栈的链式存储及应用
答:栈顶放在链表的表头,放在尾部不行!
堆栈的其他应用: 2.3 队列2.3.1 定义及顺序存储
2.队列的顺序存储
2.3.2队列的链式存储
例1:如何用两个栈模拟实现一个队列? 如果这两个堆栈的容量分别是m和n(m>n),你的方法能保证队列的最大容量是多少?(这里讨论的是顺序栈,如果是链式栈的话完全没有必要考虑空间) 2.4 应用实例及小白专场多项式的加法和乘法: //author: Paul_Huang
//Data: 15/6/2017
//#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAMES 1
#include<stdio.h>
#include<stdlib.h>
#include<process.h>//引入头文件
#include<string.h>
typedef struct Node{
int coeff;
int expo;
struct Node *next;
}PolyNode,*Polynomial;
Polynomial ReadPoly();
Polynomial AddPoly(Polynomial P1,Polynomial P2);
Polynomial MultPoly(Polynomial P1,Polynomial P2);
void PrintPoly(Polynomial P);
void Attach(int coeff,int expo,Polynomial *PtrRear);
int compare(int e1,int e2);
int main()
{
Polynomial P1,P2,PolyAdd,PolyMult;
P1 = ReadPoly();
P2 = ReadPoly();
PolyAdd = AddPoly(P1,P2);
PolyMult = MultPoly(P1,P2);
PrintPoly(PolyMult);
PrintPoly(PolyAdd);
system("pause");//暂停往下执行 按下任意键继续
return 1;
}
Polynomial ReadPoly()
{
Polynomial P,temp,rear;
int N,coeff,expo;
/*输入要的项数*/
scanf("%d",&N);
P = (Polynomial)malloc(sizeof(PolyNode));/*链表头空节点*/
P->next = NULL;
rear = P;
while (N--){
scanf("%d %d",&coeff,&expo);
Attach(coeff,expo,&rear);/*将当前项插入多项式尾端*/
}
/*删除临时节点*/
temp = P;
P = P->next;
free(temp);
return P;
}
Polynomial AddPoly(Polynomial P1,Polynomial P2)
{
Polynomial P,Rear,temp;
int sum;
P = (Polynomial)malloc(sizeof(PolyNode));/*链表头空节点*/
P->next = NULL;
Rear = P;
while (P1&&P2){
switch (compare(P1->expo,P2->expo)){
case 1: /*P1的系数更大*/
Attach(P1->coeff,P1->expo,&Rear);
P1 = P1->next;
break;
case -1:/*P2的系数更大*/
Attach(P2->coeff,P2->expo,&Rear);
P2 = P2->next;
break;
case 0:/*P1和P2的系数一样大*/
sum = P1->coeff + P2->coeff;
Attach(sum,&Rear);
P1 = P1->next;
P2 = P2->next;
}
/*将未完成的多项式补在后面*/
for (; P1; P1 = P1->next)Attach(P1->coeff,&Rear);
for (; P2; P2 = P2->next)Attach(P2->coeff,&Rear);
/*删除临时节点*/
Rear->next = NULL;
temp = P;
P = P->next;
free(temp);
return P;
}
}
Polynomial MultPoly(Polynomial P1,t1,t2,Temp;
int coeff,expo;
/*判断是否为空*/
if (!P1 || !P2)
return NULL;
t1 = P1; t2 = P2;
P = (Polynomial)malloc(sizeof(PolyNode));/*链表头空节点*/
P->next = NULL;
Rear = P;
while (t2){
Attach(t1->coeff*t2->coeff,t1->expo + t2->expo,&Rear);
t2 = t2->next;
}
t1 = t1->next;
while (t1){
t2 = P2; Rear = P;/*重置t2与Rear*/
while (t2){
coeff = t1->coeff*t2->coeff;
expo = (t1->expo + t2->expo);
while (Rear->next && Rear->next->expo > expo)
Rear = Rear->next; /*循环找到对应的节点*/
if (Rear->next && Rear->next->expo==expo){
if (Rear->next->expo + expo)
Rear->next->expo += expo;
else{
Temp = Rear->next;
Rear->next = Rear->next->next;
free(Temp);
}
}
else{
Temp = (Polynomial)malloc(sizeof(PolyNode));
Temp->coeff = coeff;
Temp->expo = expo;
Temp->next = Rear->next;
Rear->next = Temp;/*在Rear后面加上Temp*/
Rear = Temp;
}
t2 = t2->next;
}
t1 = t1->next;
}
Temp = P;
P = P->next;
free(Temp);
return P;
}
void PrintPoly(Polynomial P)
{
int flag = 0; /* 辅助调整输出格式用 */
if (!P){
printf("0 0n");
return;
}
while (P){
if (!flag)
flag = 1;
else
printf(" ");
printf("%d %d",P->coeff,P->expo);
P = P->next;
}
printf("n");
}
void Attach(int coeff,Polynomial *PtrRear)
{ /*函数传递进来的是节点指针的地址,*PtrRear*/
Polynomial P;
P = (PolyNode*)malloc(sizeof(PolyNode));//申请新节点的两种表示方法
P->coeff = coeff;
P->expo = expo;
/*将P指向的新节点插入到当前结果表达式尾项的后面*/
(*PtrRear)->next = P;
*PtrRear = P;
P->next = NULL;
}
int compare(int e1,int e2)
{
/*比较两个多项式中的指数项e1和e2,返回1、0、-1*/
if (e1 > e2) return 1;/*e1大,返回1*/
else if (e1 < e2) return -1;/*e2大,返回-1*/
else return 0;/*两者相等*/
} (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |