数据结构Online Judge第二章题目(C语言版)

文章为作者记录学习过程,小白一枚,各路大佬多多提建议,感激不尽

前言

本文是作者在学习数据结构时写在课程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 ABC 三个线性表中的元素,以逗号分隔。

输出: 输出操作之后的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;
}

总结

第二章学习后,我已经开始有意识地使用教材中给出的结构解题,同时也把各种数据结构地基本操作实现总结了出来,以后也会发布在博客里。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值