文章为作者记录学习过程,小白一枚,各路大佬多多提建议,感激不尽
题目
前言
本文是作者在学习数据结构时写在课程OJ的代码,在OJ上运行答案正确,编译器版本为GCC5.4,如有不足还望指正。
一、2.11-顺序表插入元素
设顺序表 va 中的数据为递增有序。写一个算法,将x插入到顺序表的适当位置,保证有序性。
输入: 输入分为两行,第一行是 va 顺序表,每个元素按空格分隔,第二行是 x 的值。
顺序表中的元素最多为 100 个,所有元素的值均大于 0,元素为整型。
输出: 输出插入 x 后,va 的结果
输入示例:
1 3 4 6 45 56
20
输出示例:
1 3 4 6 20 45 56
代码:
/* 设顺序表va中的数据为递增有序。写一个算法,将x插入到顺序表的适当位置,保证有序性。*/
#include <stdio.h>
#include <stdlib.h>
void main()
{
int x, c, len;
int *va;
x = c = len = 0;
va = (int *)malloc((len + 2) * sizeof(int));
do {
scanf("%d", &va[len++]);
} while ((c = getchar()) != '\n');
len--;
scanf("%d", &x);
if (x > va[len])va[len + 1] = x;
else if (x < va[0]) {
for (int k = len + 1; k >= 1; k--)
va[k] = va[k - 1];
va[0] = x;
}
else {
for (int k = 0; k <= len - 1; k++) {
if (x >= va[k] && x < va[k + 1]) {
for (int j = len + 1; j >= k + 2; j--)
va[j] = va[j - 1];
va[k + 1] = x;
break;
}
}
}
for (int j = 0; j <= len + 1; j++)
printf("%d ", va[j]);
printf("\n");
}
二、2.12-顺序表比较
设 A = ( a 1 , . . . , a m ) A=(a_1,...,a_m) A=(a1,...,am) 和 B = ( b 1 , . . . , b n ) B=(b_1,...,b_n) B=(b1,...,bn) 均为顺序表, A ′ A' A′ 和 B ′ B' B′ 分别为 A A A 和 B B B 中除去最大共同前缀后的子表(例如, A = ( x , y , y , z , x , z ) A=(x,y,y,z,x,z) A=(x,y,y,z,x,z), B = ( x , y , y , z , y , x , x , z ) B=(x,y,y,z,y,x,x,z) B=(x,y,y,z,y,x,x,z),则两者中最大的共同前缀为 ( x , y , y , z ) (x,y,y,z) (x,y,y,z),在两表中除去最大共同前缀后的子表分别为 A ′ = ( x , z ) A'=(x,z) A′=(x,z) 和 B ′ = ( y , x , x , z ) B'=(y,x,x,z) B′=(y,x,x,z)。若 A ′ = B ′ = N U L L A'=B'=NULL A′=B′=NULL,则 A = B A=B A=B;若 A ′ = N U L L A'=NULL A′=NULL,而 B ′ ≠ N U L L B'\neq NULL B′=NULL,或者两者均不为 N U L L NULL NULL,且 A ′ A' A′ 的首元小于 B ′ B' B′ 的首元,则 A < B A<B A<B;否则 A > B A>B A>B。试写一个比较 A , B A,B A,B 大小的算法。(请注意,在算法中,不要破坏原表 A A A 和 B B B,并且,也不一定先求得 A ′ A' A′ 和 B ′ B' B′ 才进行比较)。
输入: 输入为两行,分别代表 A A A 和 B B B 中的元素,以逗号分开。每个顺序表最多 100 100 100 个元素。
输出: 输出 A A A 和 B B B 的比较结果, 0 0 0 代表 A = B A=B A=B, 1 1 1 代表 A < B A<B A<B, 2 2 2 代表 A > B A>B A>B
输入示例1:
a,b,c,d
a,b,c,d,e
输出示例1:
1
输入示例2:
a,w,s
a,h,l
输出示例2:
2
代码:
/* 顺序表比较 */
#include <stdio.h>
#include <stdlib.h>
int main()
{
char *A, *B;
int len_A, len_B, c;
len_A = len_B = c = 0;
A = (char *)malloc((len_A + 1) * sizeof(char));
B = (char *)malloc((len_B + 1) * sizeof(char));
do {
scanf("%c", &A[len_A++]);
} while ((c = getchar()) != '\n');
len_A--;
do {
scanf("%c", &B[len_B++]);
} while ((c = getchar()) != '\n');
len_B--;
int i = 0;
for (i = 0; i <= len_A && i <= len_B && A[i] == B[i]; i++);
i--;
if (i == len_A && i < len_B) {
printf("1\n"); return 0;
}
else if (i == len_B && i < len_A) {
printf("2\n"); return 0;
}
else if (i == len_A && i == len_B){
printf("0\n"); return 0;
}
else {
if (A[i + 1] < B[i + 1]) {
printf("1\n"); return 0;
}
else {
printf("2\n"); return 0;
}
}
}
三、2.15-链表合并
已知指针 h a ha ha 和 h b hb hb 分别指向两个单链表的头结点,并且已知两个链表的长度分别为 m m m 和 n n n。试写一算法将这两个链表连接在一起(即令其中一个表的首元节点连在另一个表的最后一个节点之后),假设指针 h c hc hc 指向连接后的链表的头结点,并要求算法以尽可能短的时间完成链接运算。
输入: 输入包括三行,第一行是两个链表的长度m和n,第二行和第三行分别为链表ha和hb中的元素,以空格分隔。
输出: 输出合并后的链表hc,元素以空格分隔。
输入示例:
5 3
1 2 3 4 5
1 2 3
输出示例:
1 2 3 1 2 3 4 5
代码:
/* 已知指针ha和hb分别指向两个单链表的头结点,并且已知两个链表的长
* 度分别为m和n。试写一算法将这两个链表连接在一起(即令其中一个表
* 的首元节点连在另一个表的最后一个节点之后),假设指针hc指向连接
* 后的链表的头结点,并要求算法以尽可能短的时间完成链接运算。*/
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode {
int data;
struct Lnode* next;
} Lnode, LinkedList;
void main()
{
LinkedList* ha, * hb, * hc, * p;
int n1 = 0, n2 = 0;
ha = (LinkedList*)malloc(sizeof(Lnode));
hb = (LinkedList*)malloc(sizeof(Lnode));
hc = (LinkedList*)malloc(sizeof(Lnode));
p = (LinkedList*)malloc(sizeof(Lnode));
ha->next = p;
scanf("%d %d", &n1, &n2); getchar();
for (int i = 0; i < n1; i++) {
scanf("%d", &p->data); getchar();
p->next = (LinkedList*)malloc(sizeof(Lnode));
p = p->next;
}
hb->next = p;
for (int i = 0; i < n2; i++) {
scanf("%d", &p->data); getchar();
p->next = (LinkedList*)malloc(sizeof(Lnode));
p = p->next;
}
hc->next = hb->next;
p = hb->next;
for (int i = 0; i < n2-1; i++) {
p = p->next;
}
p->next = ha->next;
for (int i = 0; i < n1-1; i++) {
p = p->next;
}
p = hc->next;
for (int i = 0; i < n1 + n2; i++) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
四、2.18-链表删除元素
试写一算法,在无头节点的动态单链表上实现线性表操作 D E L E T E ( L , i ) DELETE(L,i) DELETE(L,i)。
输入: 输入包含两行,第一行是链表中的元素,第二行表示需要删除的第 i i i 个元素, i i i 从 0 0 0 开始计数;
输出: 输出删除后的链表元素,若删除后,链表不包含元素,则输出 N U L L NULL NULL。
输入示例:
1 2 3 4 5
4
输出示例:
1 2 3 4
代码:
/* 试写一算法,在无头节点的动态单链表上实现线性表操作 DELETE(L,i)。*/
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode
{
int data;
struct Lnode *next;
} Lnode, LinkedList;
extern void DELETE(LinkedList *L, int i);
void main()
{
int c = 0, len = 0, i = 0;
LinkedList *L, *p;
L = (LinkedList *)malloc(sizeof(Lnode));
p = (LinkedList *)malloc(sizeof(Lnode));
L = p;
do {
scanf("%d", &p->data);
p->next = (LinkedList *)malloc(sizeof(Lnode));
p = p->next;
len++;
} while ((c = getchar()) != '\n');
len--;
scanf("%d", &i);
if (i > len) {
printf("Error: The LinkedList is not as long as %d!", i);
}
else
DELETE(L, i);
if (len == 0 || i == 0){
printf("NULL");
}
p = L;
for (int j = 0; j < len; j++){
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
void DELETE(LinkedList *L, int i)
{
LinkedList *p;
p = L;
for(int j = 0; j < i-1; j++){
p = p->next;
}
p->next = p->next->next;
}
五、2.19-链表删除指定范围的元素
已知线性表中的元素以递增有序排列,并以单链表为存储结构。试写一高效算法,删除表中所有值大于 m i n k mink mink 且小于 m a x k maxk maxk 的元素(若表中存在这样的元素),同时释放被删节点的空间。
注意: m i n k mink mink 和 m a x k maxk maxk 是给定的两个参变量,他们的值可以和表中的元素相同,也可以不同。
输入: 输入包含两行,第一行是链表中的元素,以空格分隔;第二行分别为 m i n k mink mink 和 m a x k maxk maxk 两个元素,以空格分隔。
输出: 输出最后的链表中的元素。
输入示例:
1 2 3 4 5 8 12 15 16 22
6 18
输出示例:
1 2 3 4 5 22
代码:
/* 已知线性表中的元素以递增有序排列,并以单链表为存储结构。试写一
* 高效算法,删除表中所有值大于mink且小于maxk的元素(若表中存在
* 这样的元素),同时释放被删节点的空间。注意:mink和maxk是给定
* 的两个参变量,他们的值可以和表中的元素相同,也可以不同。*/
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode {
int data;
struct Lnode *next;
} Lnode, LinkedList;
void main()
{
int c = 0, mink = 0, maxk = 0;
LinkedList* L, * p;
L = (LinkedList*)malloc(sizeof(Lnode));
p = (LinkedList*)malloc(sizeof(Lnode));
L->next = p; L->data = 0;
do {
scanf("%d", &p->data);
p->next = (LinkedList*)malloc(sizeof(Lnode));
p = p->next;
L->data++;
} while ((c = getchar()) != '\n');//读取链表
scanf("%d %d", &mink, &maxk);
p = L->next;
while (p->data > mink && p->data < maxk) {
L->next = p->next;
L->data--;
free(p);
p = L->next;
}//查询位于首端需要删除的的元素
LinkedList *tmp;
for (int i = 1; i <= L->data; i++) {
if (p->next->data > mink && p->next->data < maxk) {
tmp = p->next;
p->next = p->next->next;
free(tmp);
L->data--;
i--;
}//查询剩余需要删除的元素
else
p = p->next;
}
p = L->next;
for (int j = 0; j < L->data; j++) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
六、2.22-链表就地逆置
试写一算法,实现单链表的就地逆置。
输入: 输入为给定链表的所有元素,以逗号分隔。
输出: 输出为链表逆置后的结果,以逗号分隔。
输入示例:
s,a,s,f,w,s,a,d,a,S
输出示例:
S,a,d,a,s,w,f,s,a,s
代码:
/* 试写一算法,实现单链表的就地逆置 */
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode {
char data;
struct Lnode* next;
} Lnode, LinkedList;
int main()
{
int i = 0, c = 0;
LinkedList* L, * p;
L = (LinkedList*)malloc(sizeof(Lnode));
p = (LinkedList*)malloc(sizeof(Lnode));
L->next = p; L->data = 0;
do {
scanf("%c", &p->data);
p->next = (LinkedList*)malloc(sizeof(Lnode));
p = p->next;
L->data++;
} while ((c = getchar()) != EOF && c != '\n');//输入链表
p = L->next;
char tmp1, tmp2;
for (int i = 0; i < (int)(L->data) / 2; i++) {
if (i) p = p->next;
tmp1 = p->data;
for (int j = 1; j < L->data - 2 * i; j++) {
p = p->next;
}
tmp2 = p->data; p->data = tmp1;
p = L->next;
for (int j = 0; j < i; j++) {
p = p->next;
}
p->data = tmp2;
}//就地逆置输入的链表
p = L->next;
for (int j = 0; j < L->data - 1; j++) {
printf("%c,", p->data);
p = p->next;
}
printf("%c\n", p->data);//打印逆置操作完成的链表
return 0;
}
七、2.29-修改链表
已知 A A A, B B B 和 C C C 为三个递增有序的线性表,现要求对 A A A 表做如下操作:删去那些既在 B B B 表中出现又在 C C C 表中出现的元素。试对顺序表编写实现上述操作的算法。
输入: 输入包含三行,分别为 A 、 B 、 C A、B、C A、B、C 三个线性表中的元素,以逗号分隔。
输出: 输出操作之后的A表中的元素。
输入示例:
a,b,c,d,e,f,g
b,e,g,h,h
c,e,g,h
输出示例:
a,b,c,d,f
代码:
/* 已知A,B和C为三个递增有序的线性表,现要求对A表做如下操作:删去
* 那些既在B表中出现又在C表中出现的元素。试对顺序表编写实现上述操
* 作的算法。*/
#include <stdio.h>
#include <stdlib.h>
int main()
{
int len_A = 0, len_B = 0, len_C = 0;
char* A, * B, * C;
A = (char*)malloc((len_A + 1) * sizeof(char));
B = (char*)malloc((len_B + 1) * sizeof(char));
C = (char*)malloc((len_C + 1) * sizeof(char));
int c = 0;
do {
scanf("%c", &A[len_A++]);
} while ((c = getchar()) != '\n');
do {
scanf("%c", &B[len_B++]);
} while ((c = getchar()) != '\n');
do {
scanf("%c", &C[len_C++]);
} while ((c = getchar()) != '\n' && c != EOF);
for (int k = 0; k < len_C; k++) {
int j;
for (j = 0; j < len_B; j++) {
if (B[j] == C[k]) {
for (int i = 0; i < len_A; i++) {
if (A[i] == B[j]) {
for (int m = i; m < len_A; m++)
A[m] = A[m + 1];
len_A--;
i--;
}
}
}
}
}
if(len_A) {
for (int i = 0; i < len_A - 1; i++) {
printf("%c,", A[i]);
}
printf("%c\n", A[len_A - 1]);
return 0;
}
else {
printf("\n");
return 0;
}
}
八、2.38-双向循环链表访问
设有一双向循环链表,每个节点中除有 p r i o r , d a t a prior,data prior,data 和 n e x t next next 三个域外,还增设了一个访问频度域 f r e q freq freq。在链表被启用之前,频度域 f r e q freq freq 的值均初始化为 0 0 0,而每当对链表进行一次 L O C A T E ( L , x ) LOCATE(L,x) LOCATE(L,x) 的操作后,被访问的节点(即元素值等于 x x x 的节点)中的频度域 f r e q freq freq 的值便增 1 1 1,同时调整链表中节点之间的次序,使其按访问频度非递增的次序顺序排列,以便始终保持被频繁访问的节点总是靠近表头结点。编写符合上述要求的 L O C A T E LOCATE LOCATE 操作的算法。
输入: 输入包含三行,第一行是链表中的元素个数,第二行是链表中的元素,第三行包含所有被访问的元素。
输出: 顺序输出从表头节点开始的链表中的元素。
注意:如果有多个元素的访问次数相同,需要按照访问次序,将先访问到的元素放在前面。
输入示例:
10
1 2 3 4 5 6 7 8 9 10
1 2 2 2 3 4 5 5 4 10 9
输出示例:
2 4 5 1 3 10 9 6 7 8
代码:
/* 设有一双向循环链表,每个节点中除有prior,data和next三个域外,还增设
* 了一个访问频度域freq。在链表被启用之前,频度域freq的值均初始化为0,
* 而每当对链表进行一次LOCATE(L,x)的操作后,被访问的节点(即元素值等
* 于x的节点)中的频度域freq的值便增1,同时调整链表中节点之间的次序,
* 使其按访问频度非递增的次序顺序排列,以便始终保持被频繁访问的节点总是
* 靠近表头结点。编写符合上述要求的LOCATE操作的算法。*/
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef int Elemtype;
typedef int Status;
typedef struct ADTList
{
Elemtype data;
struct ADTList* prior;
struct ADTList* next;
int freq;
} Lnode, LinkedList;
extern Status InitList(LinkedList** L);
extern Status LOCATE(LinkedList* L, int x);
extern Status collate(LinkedList** L, int position);
extern Status PrintList(LinkedList* L);
int main()
{
int c = 0, i = 0;
LinkedList* L;
InitList(&L);
int *x;
x = (int *)malloc(100*sizeof(int));
do {
scanf("%d", &x[i++]);
} while ((c = getchar()) != '\n');
i--;
for (int j = i; j >= 0; j--) {
collate(&L, LOCATE(L, x[j]));
}
PrintList(L);
return 0;
}
//从输入读取数据并写入双向循环链表 L
Status InitList(LinkedList** L)
{
int c = 0;
*L = (LinkedList*)malloc(sizeof(Lnode));
LinkedList* p;
p = (LinkedList*)malloc(sizeof(Lnode));
(*L)->next = p;//创建第一个结点
(*L)->data = 0; (*L)->freq = 0;
p->prior = (*L);
scanf("%d", &(*L)->data); getchar();//输入链表长度
for (int i = 0; i < (*L)->data - 1; i++) {
scanf("%d", &p->data); getchar();
p->next = (LinkedList*)malloc(sizeof(Lnode));
p->next->prior = p;
p->freq = 0;
p = p->next;
}
scanf("%d", &p->data); getchar();//输入链表数据
p->freq = 0;
p->next = (*L); (*L)->prior = p;//首尾连接
return OK;
}
Status LOCATE(LinkedList* L, int x)
{
Lnode* p; p = L->next;
int i = 1;
do {
if (p->data == x) {
p->freq++;
return i;//返回查找到的元素的位置
}
p = p->next; i++;
} while (p != L);
return ERROR;//链表中不含要查找的元素
}
Status collate(LinkedList** L, int position)
{
Lnode* p, * q;
p = (*L)->next;
for (int i = 1; i < position; i++)p = p->next;//将 p 移动到需要的 position 处
p->next->prior = p->prior;
p->prior->next = p->next;//将该处的结点剪除
q = (*L)->next;
for (int i = 1; i < (*L)->data && q->freq > p->freq; i++)
q = q->next;//将 q 移动到需要插入的位置
p->prior = q->prior;
p->next = q;
q->prior->next = p;
q->prior = p;//将 p 插入
return OK;
}
Status PrintList(LinkedList* L)
{
LinkedList* p;
p = L->next;
for (int j = 0; j < L->data - 1; j++) {
printf("%d ", p->data);
p = p->next;
}
printf("%d\n", p->data);//打印操作完成的链表
return OK;
}
九、2.41-稀疏多项式求导
试以循环链表作稀疏多项式的存储结构,编写求其导函数的算法,要求利用原多项式中的节点空间存放其导函数(多项式),同时释放所有无用(被删)节点。
稀疏多项式中采用的循环链表存储结构 L i n k e d P o l y LinkedPoly LinkedPoly 定义为:
typedef struct PolyNode{
PolyTerm data;
Struct PolyNode *next;
} PolyNode, *PolyLink;
typedef PolyLink LinkedPoly;
输入: 输入为给定的多项式。
输出: 输出为求导之后的结果,按照多项式中每一项的幂次由高到低排列。如果导数为 0 0 0,则输出 0 0 0。
输入示例1:
- 2x + 4x^2 + 2x^3 + 3x^3 + 2x + 3x^2 - 3x^10
输出示例1:
- 30x^9 + 15x^2 + 14x
输入示例2:
3x^2 + 4
输出示例2:
6x
提示:
注意要化简指数相同的项
注意输入输出中加减号的前后有空格,参见样例。如果第一项的系数是负数,则负号前面没有空格,后面有空格,参见样例。
代码:
/* 试以循环链表作稀疏多项式的存储结构,编写求其导函数的算法,要求利用原多项式中的节点空
* 间存放其导函数(多项式),同时释放所有无用(被删)节点 */
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
typedef struct {
char signal;//符号
int coefficient;//系数
int exponent;//指数
} PolyTerm;
typedef struct PolyNode {
PolyTerm data;
struct PolyNode* next;
} PolyNode, PolyLink;
typedef PolyLink LinkedPoly;
extern int InitList(PolyLink** L);
extern int MergeList(PolyLink** L);
extern int Derivation(PolyLink** L);
extern int PrintList(PolyLink* L);
void main()
{
PolyLink* L;
L = (PolyLink*)malloc(sizeof(PolyNode));
InitList(&L);
MergeList(&L);
Derivation(&L);
PrintList(L);
}
//将输入的多项式转化为链表
int InitList(PolyLink** L)
{
char c = '0';
PolyLink* p, * q;
p = (PolyLink*)malloc(sizeof(PolyNode));
q = (PolyLink*)malloc(sizeof(PolyNode));
(*L)->next = p;
do {
c = getchar();
if (c == '+' || c == '-') {
p->data.signal = c;
getchar();
c = getchar();
if (c == 'x')
p->data.coefficient = 1;
else if (c >= '0' && c <= '9') {
p->data.coefficient = 0;
do {
p->data.coefficient = p->data.coefficient * 10 + c - '0';
} while ((c = getchar()) != 'x' && c != ' ' && c != '\n');
}
else
return ERROR;
}
else if (c == 'x') {
p->data.signal = '+';
p->data.coefficient = 1;
}
else if (c >= '0' && c <= '9') {
p->data.signal = '+';
p->data.coefficient = 0;
do {
p->data.coefficient = p->data.coefficient * 10 + c - '0';
} while ((c = getchar()) != 'x' && c != ' ' && c != '\n');
}
else
return ERROR;
if (c != 'x')
p->data.exponent = 0;
else if ((c = getchar()) == '^') {
scanf("%d", &p->data.exponent);
c = getchar();
}
else
p->data.exponent = 1;
if (p->data.signal == '-')
p->data.coefficient = -p->data.coefficient;
p->next = (PolyLink*)malloc(sizeof(PolyNode));
q = p;
p = p->next;
} while (c != '\n');
free(p);
q->next = (*L);
return OK;
}
//合并多项式中的同类项并重新排列
int MergeList(PolyLink** L)
{
PolyLink* p, * q, * t;
p = (*L)->next;
q = *L;
while (p->next != (*L)) {
if (p->next->data.exponent > q->next->data.exponent) {
t = p->next;
p->next = t->next;
t->next = q->next;
q->next = t;
q = (*L);
}//将 p->next 移动到 q->next 前
else if (p->next->data.exponent == q->next->data.exponent) {
q->next->data.coefficient += p->next->data.coefficient;
t = p->next;
p->next = t->next;
free(t);
if (q->next->data.coefficient < 0)
q->next->data.signal = '-';
else if (q->next->data.coefficient > 0)
q->next->data.signal = '+';
else {
q->next = q->next->next;
p = q;
}
q = (*L);
}//合并 p->next 与 q->next 并删除 p->next
else {
q = q->next;
if (q == p) {
p = p->next;
q = (*L);
}
}
}
}
//求导
int Derivation(PolyLink** L)
{
LinkedPoly* p;
p = (*L)->next;
while (p != (*L)) {
if (p->data.exponent != 0)
p->data.coefficient *= p->data.exponent--;
else
p->data.coefficient = p->data.exponent = 0;
p = p->next;
}
return OK;
}
//打印存储多项式的链表
int PrintList(PolyLink* L)
{
PolyLink* p;
p = L->next;
if (p == L)printf("0");
if (p->data.signal == '+' && p->data.exponent != 0 && p->data.coefficient != 0) {
printf("%dx", p->data.coefficient);
if (p->data.exponent != 1)
printf("^%d ", p->data.exponent);
else
printf(" ");
p = p->next;
}
else if (p->data.signal == '+' && p->data.exponent == 0) {
printf("%d\n", p->data.coefficient);
return OK;
}
else if (p->data.signal == '-') {
p->data.coefficient = -p->data.coefficient;
if (p->data.coefficient != 0)
printf("- ");
printf("%d", p->data.coefficient);
if (p->data.exponent != 0) {
printf("x");
if (p->data.exponent != 1)
printf("^%d", p->data.exponent);
}
printf(" ");
p = p->next;
}
for (; p != L; p = p->next) {
if (p->data.coefficient < 0) {
p->data.coefficient = -p->data.coefficient;
p->data.signal = '-';
}
if (p->data.exponent != 0) {
printf("%c %dx", p->data.signal, p->data.coefficient);
if (p->data.exponent != 1)
printf("^%d ", p->data.exponent);
else
printf(" ");
}
else if (p->data.exponent == 0 && p->data.coefficient != 0)
printf("%c %d ", p->data.signal, p->data.coefficient);
}
printf("\n");
return OK;
}
总结
第二章学习后,我已经开始有意识地使用教材中给出的结构解题,同时也把各种数据结构地基本操作实现总结了出来,以后也会发布在博客里。