线性表-单链表和单循环链表解析

目录

单链表和单循环链表的概念

单链表:

单循环链表:

单链表

单循环链

 完整项目代码

main.c

SingleLinkList.h

SingleLinkList.c

 welcome.h

总结

一元多项式相加习题


单链表和单循环链表的概念

  1. 单链表:

    • 单链表是一种线性数据结构,由一系列节点组成。每个节点包含一个数据元素和一个指向下一个节点的指针(通常称为next指针)。
    • 单链表中的节点按顺序连接,每个节点只有一个指针指向下一个节点,而最后一个节点的指针指向空(NULL),表示链表的结束。
    • 单链表的优点是插入和删除节点的操作相对高效,但访问特定节点需要从头节点开始遍历整个链表。
  2. 单循环链表:

    • 单循环链表是一种特殊的链表结构,和单链表类似,最后一个节点的指针不为空,而是指向链表的头节点,形成一个循环。
    • 单循环链表的节点按顺序连接形成循环,最后一个节点的指针指向头节点,形成了一个闭环。
    • 单循环链表可以从任何一个节点开始遍历整个链表,可以方便地实现循环操作,例如模拟循环队列等。

单链表

头插法:通过将新节点插入到链表的头部来构建链表。

尾插法:通过将新节点插入到链表的尾部来构建链表。

 

插入元素:在链表中插入元素的算法,根据要插入的位置,可以使用头插法或尾插法。使用头插法时,将新节点插入到链表的头部;使用尾插法时,将新节点插入到链表的尾部。

查找元素:在链表中查找指定元素的算法,需要遍历整个链表,在每个节点上进行比较,直到找到目标元素或遍历完整个链表。

链表长度:即链表中包含的节点个数。遍历链表,每经过一个节点,计数器加一,直到遍历完整个链表。最后得到的计数器值即为链表的长度。

遍历链表:将链表中的节点值依次输出。遍历链表的每个节点,将节点的值输出,直到遍历完整个链表。

删除元素:在链表中删除指定元素的算法,需要找到目标元素所在的节点,然后将它从链表中移除。

初始化函数 init
   - 作用:创建链表的头节点并进行初始化工作。
   - 功能:使用动态内存分配创建头节点,并将头节点的指针指向NULL,表示链表为空。

/*1. 初始化*/
int init(SingleLinkList **Head) {
    /*申请内存*/
    (*Head) = (SingleLinkList *) malloc(sizeof(SingleLinkList));
    /*判断内存申请是否成功*/
    if (*Head == NULL) {
        printf("申请内存错误, 初始化失败![100001]\n");
        return 100001;
    }
    (*Head)->next = NULL;
    return 0;
}

2. 头插法插入函数 insert_head:
   - 作用:在链表头部插入一个新节点。
   - 功能:创建一个新节点,将新节点的指针指向原头节点的next,然后更新头节点的next指针为新节点。

/*2. 插入元素,头插法*/
int insert_head(SingleLinkList **Head, DataType x) {
    SingleLinkNode *newNode;

    newNode = (SingleLinkNode *) malloc(sizeof(SingleLinkNode));
    if (!newNode) {
        printf("申请节点内存空间失败![100004]\n");
        return 100004;
    }
    newNode->data = x;
    newNode->next = (*Head)->next;

    (*Head)->next = newNode;

    return 0;
}

3. 尾插法插入函数 insert_tail:
   - 作用:在链表尾部插入一个新节点。
   - 功能:遍历链表找到最后一个节点,创建一个新节点,并将最后一个节点的next指针指向新节点。

/*3. 插入元素, 尾插法*/
int insert_tail(SingleLinkList **Head, DataType x) {
    SingleLinkNode *newNode;
    SingleLinkNode *p;

    newNode = (SingleLinkNode *) malloc(sizeof(SingleLinkNode));
    if (!newNode) {
        printf("申请节点内存空间失败![100004]\n");
        return 100004;
    }

    newNode->data = x;
    newNode->next = NULL;

    p = (*Head);

    while (p->next) {
        p = p->next;
    }

    p->next = newNode;

    return 0;
}

4. 插入函数 insert:
   - 作用:在指定位置插入一个新节点。
   - 功能:遍历链表找到要插入位置的前一个节点,创建一个新节点,并将新节点的指针指向原位置的节点,然后更新前一个节点的指针为新节点。

/*4. 插入元素,在位置i处插入元素x */
int insert(SingleLinkList **Head, int i, DataType x) {
    int j;
    SingleLinkNode *p;
    SingleLinkNode *newNode;


    /*对i进行判断,0<i<=length+1*/
    if (i < 1 || i > length(*Head) + 1) {
        printf("位置i不是链表有效位置![100005]\n");
        return 100005;
    }
    p = (*Head);
    j = 1;

    while (j < i) {
        j++;
        p = p->next;
    }

    newNode = (SingleLinkNode *) malloc(sizeof(SingleLinkNode));

    if (!newNode) {
        printf("申请节点内存空间失败![100004]\n");
        return 100004;
    }


    newNode->data = x;
    newNode->next = p->next;
    p->next = newNode;
    return 0;
}

 5. 查找函数 find:
   - 作用:在链表中查找指定元素,并返回其位置。
   - 功能:遍历链表,找到指定元素后返回其位置,未找到则返回NULL。

/*5. 查找值为x的元素,返回位置i */
int find(SingleLinkList *Head, DataType x) {
    int i;
    SingleLinkNode *p;

    i = 1;
    p = Head->next;

    while (p && p->data != x) {
        i++;
        p = p->next;
    }

    if (!p) {
        return 0;
    } else {
        return i;
    }

}

6. 求链表长度的函数 length:
   - 作用:计算链表中的节点个数。
   - 功能:遍历整个链表,并计数链表中的节点个数,返回节点数作为链表的长度。

/*6. 链表长度*/
int length(SingleLinkList *Head) {
    int len = 0;
    SingleLinkNode *p;

    p = Head->next;
    while (p) {
        len++;
        p = p->next;
    }
    return len;
}

7. 打印函数 print:
   - 作用:打印链表中的数据元素。
   - 功能:遍历链表并将其中的每个节点的数据打印出来。

/*7.输出链表*/
void print(SingleLinkList *Head) {
    SingleLinkNode *p;
    int i = 0;

    p = Head->next;
    if (!p) {
        printf("链表为空!\n");
        return;
    }
    while (p) {
        printf("Node[%d]. = %d\n", ++i, p->data);
        p = p->next;
    }
}

 8. 删除函数 delete:
   - 作用:删除链表中指定元素的节点。
   - 功能:首先使用find函数找到元素的位置,然后遍历链表找到位置的前一个节点,将前一个节点的指针指向位置后面的节点,并释放删除节点的内存。

/*8. 删除元素, 删除值为x的元素*/
int delete(SingleLinkList **Head, DataType x) {
    int i;
    int j;

    SingleLinkNode *p;
    SingleLinkNode *q; /*要删除的元素x*/

    i = find(*Head, x);
    if (!i) {
        printf("元素x【%d】不存在!100006\n", x);
        return 100006;
    }

    p = (*Head);
    j = 1;

    while (j < i) {
        j++;
        p = p->next;
    }

    q = p->next;
    p->next = q->next;

    free(q); /*释放内存*/

    return 0;
}

单循环链

  1. 初始化:
    初始化一个空的单循环链表,需要创建一个头指针,并将头指针的next指针指向自身,表示空链表。

  2. 头插法:
    头插法是在链表的头部插入新节点的方法。具体步骤是,创建一个新节点,将新节点的next指针指向原链表的头节点,然后将头节点的next指针指向新节点,最后更新头指针指向新的头节点。

  3. 尾插法:
    尾插法是在链表的尾部插入新节点的方法。具体步骤是,创建一个新节点,将新节点的next指针指向头节点,然后将链表的尾节点的next指针指向新节点,最后更新尾节点指向新的尾节点。

  4. 插入元素:
    插入元素到指定位置,可以根据插入位置使用头插法或尾插法进行插入操作。

  5. 查找元素:
    从头节点开始遍历链表,逐个比较节点的值,直到找到目标元素或者到达尾节点。如果找到目标元素,返回该节点的指针;否则返回空指针表示未找到。

  6. 求链表长度:
    遍历链表,逐个统计节点的个数,即为链表的长度。

  7. 输出链表:
    从头节点开始遍历链表,逐个打印或处理节点的值,直到到达尾节点。

  8. 删除元素:
    删除链表中指定值的节点,需要先查找到目标元素,然后修改前一个节点的next指针,指向目标节点的next指针,最后释放被删除节点的内存空间。

1.链表初始化函数 init

  • 作用:用于初始化循环链表,创建一个头结点,并将头结点的next指针指向自身,形成一个空的循环链表。
  • 功能:如果链表已经初始化,则输出错误信息;否则申请内存,判断内存申请是否成功,将头结点的next指针指向自身,并返回0表示初始化成功。
/*1. 初始化*/
int init(SingleLinkList **Head)
{
    if(Head != NULL)
    {
        /*申请内存*/
        (*Head) = (SingleLinkList*)malloc(sizeof(SingleLinkList));
        /*判断内存申请是否成功*/
        if(*Head == NULL)
        {
            printf("申请内存错误, 初始化失败![100001]\n");
            return 100001;
        }
        (*Head)->next = *Head;
        return 0;
    }
    else
    {
        printf("该链表已经初始化!请删除后再执行此操作![100002]\n");
        return 100002;
    }
}

2.头插法插入元素函数 insert_head

  • 作用:将新元素插入链表头部。
  • 功能:申请一个新节点,如果申请内存失败则输出错误信息,将新节点的data赋值为要插入的元素,将新节点的next指针指向原头结点的next指针指向的节点,将头节点的next指针指向新节点,并返回0表示插入成功。
/*2. 插入元素,头插法*/
int insert_head(SingleLinkList **Head, DataType x)
{
    SingleLinkNode *newNode;

    newNode = (SingleLinkNode*)malloc(sizeof(SingleLinkNode));
    if(!newNode)
    {
        printf("申请节点内存空间失败![100004]\n");
        return 100004;
    }
    newNode->data = x;
    newNode->next = (*Head)->next;

    (*Head)->next = newNode;

    return 0;
}

3.尾插法插入元素函数 insert_tail

  • 作用:将新元素插入链表尾部。
  • 功能:申请一个新节点,如果申请内存失败则输出错误信息,将新节点的data赋值为要插入的元素,将新节点的next指针指向头结点,遍历链表找到尾节点,将尾节点的next指针指向新节点,并将新节点的next指针指向头结点,返回0表示插入成功。
/*3. 插入元素, 尾插法*/
int insert_tail(SingleLinkList **Head, DataType x)
{
    SingleLinkNode *newNode;
    SingleLinkNode *p;

    newNode = (SingleLinkNode*)malloc(sizeof(SingleLinkNode));
    if(!newNode)
    {
        printf("申请节点内存空间失败![100004]\n");
        return 100004;
    }

    newNode->data = x;
    newNode->next = *Head;
    p = (*Head);
    while(p->next != NULL && p->next != *Head)
    {
        p = p->next;
    }

    p->next = newNode;
    newNode->next = *Head;
    return 0;
}

4.在指定位置插入元素函数 insert

  • 作用:在位置i处插入新元素。
  • 功能:对i进行判断,若i不是链表的有效位置,则输出错误信息;否则,遍历链表找到位置i的前一个节点,申请一个新节点,将新节点的data赋值为要插入的元素,将新节点的next指针指向位置i的节点,将位置i的前一个节点的next指针指向新节点,并返回0表示插入成功。
​
/*4. 插入元素,在位置i处插入元素x */
int insert(SingleLinkList **Head, int i, DataType x)
{
    int j;
    SingleLinkNode *p;
    SingleLinkNode *newNode;


    /*对i进行判断,0<i<=length+1*/
    if(i<1 || i>length(*Head)+1)
    {
        printf("位置i不是链表有效位置![100005]\n");
        return 100005;
    }
    p = (*Head);
    j = 1;

    while(j<i)
    {
        j++;
        p = p->next;
    }

    newNode = (SingleLinkNode*)malloc(sizeof(SingleLinkNode));
    /*此处省略检测newNode是否申请成功*/

    newNode->data = x;
    newNode->next = p->next;
    p->next = newNode;
    return 0;
}

​

5.查找元素位置函数 find

  • 作用:查找链表中值为x的元素的位置。
  • 功能:初始化i为1,将p指针指向头节点的next指针指向的节点,遍历链表,如果p指针指向的节点不是头节点且值不等于x,则i加1,p指针指向下一个节点;如果p指针指向的节点是头节点,则返回0表示找不到元素x;否则返回i表示找到了元素x的位置。
/*5. 查找值为x的元素,返回位置i */
int find(SingleLinkList *Head, DataType x)
{
    int i;
    SingleLinkNode *p;

    i = 1;
    p = Head->next;

    while(p!= Head && p->data != x)
    {
        i++;
        p = p->next;
    }

    if(p->next == Head)
    {
        return 0;
    }
    else
    {
        return i;
    }

}

6.链表长度函数 length

  • 作用:返回链表的长度。
  • 功能:初始化长度len为0,将p指针指向头节点的next指针指向的节点,遍历链表,每遍历一个节点,长度len加1,最后返回长度len。 
​
/*6. 链表长度*/
int length(SingleLinkList *Head)
{
    int len=0;
    SingleLinkNode *p;
    p = Head->next;
    while(p!=Head)
    {
        len++;
        p = p->next;
    }
    return len;
}

​

7.输出链表函数 print

  • 作用:打印链表的所有元素。
  • 功能:初始化节点编号为0,将p指针指向头节点的next指针指向的节点,如果p为NULL,则链表为空,输出相应信息;否则,遍历链表,输出每个节点的编号和数据,并将p指针指向下一个节点,直到p指针指向头节点。
/*7.输出链表*/
void print(SingleLinkList *Head)
{
    SingleLinkNode *p;
    int i=0;

    p = Head->next;
    if(!p)				/*  if(p!=Head)  */
    {
        printf("链表为空!\n");
        return;
    }
    while(p != Head)
    {
        printf("Node[%d]. = %d\n", ++i, p->data);
        p = p->next;
    }
}

8.删除函数 delete

  • 作用:删除链表中指定元素的节点。
  • 功能:首先使用find函数找到元素的位置,然后遍历链表找到位置的前一个节点,将前一个节点的指针指向位置后面的节点,并释放删除节点的内存。
/*8. 删除元素, 删除值为x的元素*/
int delete(SingleLinkList **Head, DataType x)
{
    int i;
    int j;

    SingleLinkNode *p;
    SingleLinkNode *q; /*要删除的元素x*/

    i = find(*Head,x);
    if(!i)
    {
        printf("元素x【%d】不存在!100006\n", x);
        return 100006;
    }

    p = (*Head);
    j=1;

    while(j<i)
    {
        j++;
        p = p->next;
    }

    q = p->next;
    p->next = q->next;

    free(q); /*释放内存*/

    return 0;
}

运行结果 

 

 完整项目代码

main.c

#include <stdio.h>
#include <string.h>
#include "SingleLinkList.c"
#include "welcome.h"


int main(int argc, char* argv[])
{
	SingleLinkList *Head;
	DataType x;
	int i,m,n,cmd;

	for(i=0;i<strlen(welcome);i++)
	{
		printf("%c",welcome[i]);
		for(m=0;m<1000;m++)
			for(n=0;n<1000;n++)
			{
				;
			}
	}

	printf("-----------简单链表演示程序----------\n");
	do
	{
		printf("1. 初始化链表表\n");
		printf("2. 插入元素(头插法)\n");
		printf("3. 插入元素(尾插法)\n");
		printf("4. 插入元素(在位置i插入)\n");
		printf("5. 查找元素x\n");
		printf("6. 求链表长度\n");
		printf("7. 输出链表\n");
		printf("8. 删除元素\n");
		printf("10. 帮助\n"); 
		printf("0. 退出\n");
		printf("请输入您要进行的操作(1~6,0退出):");
		scanf("%d", &cmd);
		switch(cmd)
		{
		case 1:
			if(!init(&Head))
			{
				printf("链表已初始化!\n");
			}
			break;
		case 2:
			printf("请输入插入元素x:x=");
			scanf("%d",&x);
			if(!insert_head(&Head,x))
			{
				printf("元素(%d)已插入\n", x);
			}
			break;
		case 3:
			printf("请输入插入元素x:x=");
			scanf("%d",&x);
			if(!insert_tail(&Head,x))
			{
				printf("元素(%d)已插入\n", x);
			}
			break;
		case 4:
			printf("请输入插入元素位置i和元素x(i,x):");
			scanf("%d,%d", &i, &x);
			if(!insert(&Head, i, x))
			{
				printf("已在位置(%d)插入元素(%d)!\n",i, x);
			}
			break;
		case 5:
			printf("请输入要查找的元素x:");
			scanf("%d", &x);
			if((i = find(Head,x)))
			{
				printf("元素%d存在,在链表位置%d.\n", x, i);
			}
			else
			{
				printf("在链表中未找到元素x。\n");
			}
			break;
		case 6:
			printf("链表的长度为:%d\n", length(Head));
			break;
		case 7:
			print(Head);
			break;
		case 8:
			printf("请输入要删除的元素x:");
			scanf("%d", &x);
			if(!delete(&Head, x))
			{
				printf("元素x【%d】已删除!\n", x);
			}
			break;
		case 10:
			printf(" 本程序为链表的演示程序,有王闻薪设计开发,程序完成了。。。。功能!。。。\n");
			break;
			
		}
	}while(cmd != 0);

	return 0;
}

SingleLinkList.h

/*
	SingleLinkList.h
*/

typedef int DataType;

/*简单链表的定义*/
typedef struct node
{
	DataType		data;	/*数据域*/
	struct node		*next;	/*指针域*/
}SingleLinkList, SingleLinkNode;


/*1. 初始化*/
int init(SingleLinkList **Head);

/*2. 插入元素,头插法*/
int insert_head(SingleLinkList **Head, DataType x);

/*2. 插入元素, 尾插法*/
int insert_tail(SingleLinkList **Head, DataType x);

/*2. 插入元素,在位置i处插入元素x */
int insert(SingleLinkList **Head, int i, DataType x);

/*3. 删除元素, 删除值为x的元素*/
int delete(SingleLinkList **Head, DataType x);

/*5. 查找值为x的元素,返回位置i */
int find(SingleLinkList *Head, DataType x);

/*6. 求链表的长度 */
int length(SingleLinkList *Head);

/*7.输出链表*/
void print(SingleLinkList *Head);

SingleLinkList.c

/*
	SingleLinkList.c
	
*/
#include "SingleLinkList.h"
#include <stdlib.h>
#include <stdio.h>

/*1. 初始化*/
int init(SingleLinkList **Head)
{
    if(Head != NULL)
    {
        /*申请内存*/
        (*Head) = (SingleLinkList*)malloc(sizeof(SingleLinkList));
        /*判断内存申请是否成功*/
        if(*Head == NULL)
        {
            printf("申请内存错误, 初始化失败![100001]\n");
            return 100001;
        }
        (*Head)->next = *Head;
        return 0;
    }
    else
    {
        printf("该链表已经初始化!请删除后再执行此操作![100002]\n");
        return 100002;
    }
}


/*2. 插入元素,头插法*/
int insert_head(SingleLinkList **Head, DataType x)
{
    SingleLinkNode *newNode;

    newNode = (SingleLinkNode*)malloc(sizeof(SingleLinkNode));
    if(!newNode)
    {
        printf("申请节点内存空间失败![100004]\n");
        return 100004;
    }
    newNode->data = x;
    newNode->next = (*Head)->next;

    (*Head)->next = newNode;

    return 0;
}


/*2. 插入元素, 尾插法*/
int insert_tail(SingleLinkList **Head, DataType x)
{
    SingleLinkNode *newNode;
    SingleLinkNode *p;

    newNode = (SingleLinkNode*)malloc(sizeof(SingleLinkNode));
    if(!newNode)
    {
        printf("申请节点内存空间失败![100004]\n");
        return 100004;
    }

    newNode->data = x;
    newNode->next = *Head;
    p = (*Head);
    while(p->next != NULL && p->next != *Head)
    {
        p = p->next;
    }

    p->next = newNode;
    newNode->next = *Head;
    return 0;
}


/*2. 插入元素,在位置i处插入元素x */
int insert(SingleLinkList **Head, int i, DataType x)
{
    int j;
    SingleLinkNode *p;
    SingleLinkNode *newNode;


    /*对i进行判断,0<i<=length+1*/
    if(i<1 || i>length(*Head)+1)
    {
        printf("位置i不是链表有效位置![100005]\n");
        return 100005;
    }
    p = (*Head);
    j = 1;

    while(j<i)
    {
        j++;
        p = p->next;
    }

    newNode = (SingleLinkNode*)malloc(sizeof(SingleLinkNode));
    /*此处省略检测newNode是否申请成功*/

    newNode->data = x;
    newNode->next = p->next;
    p->next = newNode;
    return 0;
}


/*3. 删除元素, 删除值为x的元素*/
int delete(SingleLinkList **Head, DataType x)
{
    int i;
    int j;

    SingleLinkNode *p;
    SingleLinkNode *q; /*要删除的元素x*/

    i = find(*Head,x);
    if(!i)
    {
        printf("元素x【%d】不存在!100006\n", x);
        return 100006;
    }

    p = (*Head);
    j=1;

    while(j<i)
    {
        j++;
        p = p->next;
    }

    q = p->next;
    p->next = q->next;

    free(q); /*释放内存*/

    return 0;
}


/*5. 查找值为x的元素,返回位置i */
int find(SingleLinkList *Head, DataType x)
{
    int i;
    SingleLinkNode *p;

    i = 1;
    p = Head->next;

    while(p!= Head && p->data != x)
    {
        i++;
        p = p->next;
    }

    if(p->next == Head)
    {
        return 0;
    }
    else
    {
        return i;
    }

}

/*4. 链表长度*/
int length(SingleLinkList *Head)
{
    int len=0;
    SingleLinkNode *p;
    p = Head->next;
    while(p!=Head)
    {
        len++;
        p = p->next;
    }
    return len;
}

/*6.输出链表*/
void print(SingleLinkList *Head)
{
    SingleLinkNode *p;
    int i=0;

    p = Head->next;
    if(!p)				/*  if(p!=Head)  */
    {
        printf("链表为空!\n");
        return;
    }
    while(p != Head)
    {
        printf("Node[%d]. = %d\n", ++i, p->data);
        p = p->next;
    }
}

 welcome.h

char welcome[] = "____    __    ____  ___      .__   __.   ___________    __    ____  _______ .__   __. ___   ___  __  .__   __. \n"
                 "\\   \\  /  \\  /   / /   \\     |  \\ |  |  /  _____\\   \\  /  \\  /   / |   ____||  \\ |  | \\  \\ /  / |  | |  \\ |  | \n"
                 " \\   \\/    \\/   / /  ^  \\    |   \\|  | |  |  __  \\   \\/    \\/   /  |  |__   |   \\|  |  \\  V  /  |  | |   \\|  | \n"
                 "  \\            / /  /_\\  \\   |  . `  | |  | |_ |  \\            /   |   __|  |  . `  |   >   <   |  | |  . `  | \n"
                 "   \\    /\\    / /  _____  \\  |  |\\   | |  |__| |   \\    /\\    /    |  |____ |  |\\   |  /  .  \\  |  | |  |\\   | \n"
                 "    \\__/  \\__/ /__/     \\__\\ |__| \\__|  \\______|    \\__/  \\__/     |_______||__| \\__| /__/ \\__\\ |__| |__| \\__| \n"
                 "                                                                                                               \n";


总结

单链表是一种线性数据结构,节点包含数据和指向下一个节点的指针;而单循环链表是在单链表的基础上,最后一个节点的指针不为空,而是指向链表的头节点,形成一个循环。单循环链表可以从任何一个节点开始遍历整个链表,便于实现循环操作。 

一元多项式相加习题

#include <stdio.h>
#include<stdlib.h>

typedef struct node//一元多项式定义
{
    float coef;       // 系数
    int expn;         // 指数
    struct node *next; // 后继
} pnode, *polynomial; // 一元多项式的创建

polynomial createpolyn(polynomial p, int m)
{
    int i;
    polynomial q, pre, s;                  // 节点 q,pre,s
    p = (polynomial)malloc(sizeof(pnode)); // 生成新节点
    p->next = 0;                           // 先建立一个头节点的单链表
    p->expn = -1;                          // 头节点指数值设为-1
    for (i = 0; i < m; i++)                // 依次输入m个非零值
    {
        s = (polynomial)malloc(sizeof(pnode)); // 生成新节点
        printf("输入系数和指数:");
        scanf("%f%d", &s->coef, &s->expn); // 输入系数和指数
        pre = p;                           // pre来保存q的前驱
        q = p->next;                       // q初值为首节点
        while (q && q->expn <= s->expn)    // 找到第一个大于输入项指数的项q
        {
            pre = q;
            q = q->next;
        }
        s->next = q;pre->next = s; // 将输入项s,插入到q和pre之间

    }
    printf("--创建成功--\n");
    return p;
}// 一元多项式打印

void pri(polynomial p)
{
    polynomial q;
    int id = 1;
    q = p->next; // 第一项(首结点)
    printf("加法运算后结果为:\n");
    while (q)
    {
        printf("第%d个结点:系数%f,指数%d\n", id, q->coef, q->expn); // 结点后移
        q = q->next;
        id++;
    } // 一元多项式相加
}

polynomial addpolyn(polynomial pa, polynomial pb)
{
    polynomial p1, p2, p3, q;
    int sum; // 系数和   sum
    p1 = pa->next;p2 = pb->next;

    p3 = pa;         // p3 指向和多项式的当前结点
    while (p1 && p2) // p1和p2均非空
    {
        if (p1->expn == p2->expn) // 指数相同
        {
            sum = p1->coef + p2->coef; // sum 保存两项的系数和
            if (sum)                   // 系数和不为0
            {
                p1->coef = sum; // 修改结点p1的系数值
                p3->next = p1;
                p3 = p1;       // 将修改后的结点p1链在p3之后
                p1 = p1->next; // p1 指向后一项
                q = p2;
                p2 = p2->next;free(q); // 删除pb当前结点q
            }
            else // 系数和为0
            {
                q = p1;
                p1 = p1->next;free(q); // 删除pa当前结点pl
                q = p2;
                p2 = p2->next;
                free(q); // 删除pb当前结点p2
            }
        }
        else
        {
            if (p1->expn <= p2->expn) // pa当前结点p1的指数值小
            {
                p3->next = p1; // 将p1链在p3之后
                p3 = p1;       // p3 指向pl
                p1 = p1->next; // p1 指向后一场
            }
            else
            {
                p3->next = p2; // pb当前结点p2的指数值小
                p3 = p2;       // 将p2链接在p3之后
                p2 = p2->next; // p2指向后一项
            }
        }
    }

    p3->next = p1 ? p1 : p2; // 插入非空多项式的剩余段
    free(pb);                // 释放pb的头结点
    return pa;               // 返回和多项式
}

int main()
{
    int m;
    polynomial pa, pb, pc; // 声明一元多项式
    printf("==================创建一元多项式==================\n");
    printf("创建 A 项数:\n");
    scanf("%d", &m);         // 创建pa项数
    pa = createpolyn(pa, m); // 创建一元多项式pa
    printf("创建 B 项数:\n");
    scanf("%d", &m);         // 创建pb项数
    pb = createpolyn(pb, m); // 创建一元多项式pb
    printf("==================一元多项式相加==================\n");
    pc = addpolyn(pa, pb); // 一元多项式相加
    pri(pc);               // 打印一元多项式
    printf("=======================END=======================\n");
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值