练习题——线性表

一、编写一个由多个函数构成的完整程序,实现顺序表的建立、按照内容查找、插入、删除、显示操作。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MaxSize 20
typedef struct SeqList   //线性表顺序存储结构定义
{
    int elem[MaxSize];
    int length;
}SeqList;

int Init_SeqList(SeqList *L)  //顺序表初始化
{
    L->length=0;
    return 1;
}

int Locate_SeqList(SeqList *L,int x)   //按值查找
{
    int i=0;
    while(i<L->length&&L->elem[i]!=x)
        i++;
    if(i>=L->length)
     {
         printf("顺序表中不存在该元素!\n");
         return 0;
     }
     else
        return i+1;
}

int Insert_SeqList(SeqList *L,int i,int x)//在顺序表的第i个位置上插入元素x
{
    int j;
    if(L->length>=MaxSize)
        {printf("顺序表已满,无法插入!");return 0;}
    if(i<=0||i>L->length+1)
        {printf("插入位置不正确!");return 0;}
    for(j=L->length-1;j>=i-1;j--)
      {
        L->elem[j+1]=L->elem[j];
      }
        L->elem[i-1]=x;
        L->length++;
 return 1;
}

int Delete_SeqList(SeqList *L,int i)  //在顺序表中删除第i个元素
{
    int j;
    if(i<1||i>L->length)
      {
        printf("删除位置不正确!");
        return 0;
      }
    for(j=i;j<L->length;j++)
        L->elem[j-1]=L->elem[j];
     L->length--;
     return 1;
}

int Display_SeqList(SeqList L)  //显示顺序表
{
    int i;
    for(i=0;i<L.length;i++)
     {
        printf("%d",L.elem[i]);
     }
    return 1;
}

int main()
{
    SeqList L;
    int x;
    int i=1,k,j;
    Init_SeqList(&L);
    printf("初始化\n建立顺序表如下:");
    Insert_SeqList(&L,1,1);
    Insert_SeqList(&L,2,2);
    Insert_SeqList(&L,3,3);
    Insert_SeqList(&L,4,4);
    Display_SeqList(L);
    printf("\n");
    while(i<=3)
    {
        printf("\n        主菜单      \n");
        printf("   1   查找指定元素    \n");
        printf("   2   插入元素到指定位置   \n");
        printf("   3   删除某一指定位置元素  \n");
        printf("   0   结束程序            \n");
        printf("----------------------------\n");
        printf("请输入您选择的菜单号<1,2,3,0>:");
        scanf("%d",&i);
        switch(i)
        {
        case 1:
            printf("请输入查找元素: ");
            scanf("%d",&x);
            j=Locate_SeqList(&L,x);
            if(j!=0)
                printf("指定元素位置=%d\n",j);
            break;
        case 2:
            printf("请输入插入元素位置: "); scanf("%d",&k);
            printf("请插入元素值: ");   scanf("%d",&x);
            j=Insert_SeqList(&L,k,x);
            if(j!=0)
              {
                printf("插入后顺序表如下所示\n");
                Display_SeqList(L);
                printf("\n");
              }
            break;
        case 3:
            printf("请输入插入元素位置: ");
            scanf("%d",&k);
            j=Delete_SeqList(&L,k);
            if(j!=0)
            {
                printf("删除后顺序表如下所示:");
                Display_SeqList(L);
                printf("\n");
            }
            break;
        case 0:
            exit(0); break;
        default:
            printf("输出有误!");
        }
    }
    return 0;
}

二、建立一个顺序表,已知顺序表L中的元素为int,请写一时间复杂度O(n)、空间复杂度为O(1)的程序,将L中的数值为奇数的元素排在前面,数值为偶数元素排在后面。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MaxSize 5
typedef struct SeqList   //线性表顺序存储结构定义
{
    int elem[MaxSize];
    int length;
}SeqList;

void Init_SeqList(SeqList *L)  //顺序表初始化
{
    L->length=0;
}

void Insert_SeqList(SeqList *L,int i,int x)//在顺序表的第i个位置上插入元素x
{
    int j;
    if(L->length>=MaxSize)
        {printf("顺序表已满,无法插入!");}
    if(i<=0||i>L->length+1)
        {printf("插入位置不正确!");}
    for(j=L->length-1;j>=i-1;j--)
      {
        L->elem[j+1]=L->elem[j];
      }
        L->elem[i-1]=x;
        L->length++;
}

void Locate_SeqList(SeqList *L)//按位查找
{
    int i;
    int j=0;
    int k=0;
    for(i=0;i<MaxSize;i++)
    {
    if(L->elem[i]%2==1)
     {
        k=L->elem[i];
        L->elem[i]=L->elem[j];
        L->elem[j]=k;
        j++;
     }
    }
}

void Display_SeqList(SeqList L)  //显示顺序表
{
    int i;
    for(i=0;i<L.length;i++)
     {
        printf("%d",L.elem[i]);
     }
}

int main()
{
    SeqList L;
    Init_SeqList(&L);
    printf("初始化\n建立顺序表如下:");
    Insert_SeqList(&L,1,1);
    Insert_SeqList(&L,2,2);
    Insert_SeqList(&L,3,3);
    Insert_SeqList(&L,4,4);
    Insert_SeqList(&L,5,5);
    Locate_SeqList(&L);
    Display_SeqList(L);
    printf("\n");
    return 0;
}

三、建立一个非递减的顺序表L,已知顺序表L中的元素为int,请编写一个算法,删除所有值相等的多余元素。要求时间复杂度为O(n),空间复杂度为O(1)。

注:如果算法执行所需要的临时空间不随着某个变量n的大小而变化,即此算法空间复杂度为一个常量,可表示为O(1)

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define MaxSize 100
typedef struct SeqList   //线性表顺序存储结构定义
{
    int elem[MaxSize];
    int length;
}SeqList;

void Init_SeqList(SeqList *L)  //顺序表初始化
{
    L->length=0;
}

void Insert_SeqList(SeqList *L,int i,int x)//在顺序表的第i个位置上插入元素x
{
    int j;
    if(L->length>=MaxSize)
        {printf("顺序表已满,无法插入!");}
    if(i<=0||i>L->length+1)
        {printf("插入位置不正确!");}
    for(j=L->length-1;j>=i-1;j--)
      {
        L->elem[j+1]=L->elem[j];
      }
        L->elem[i-1]=x;
        L->length++;
}

void Delete_SeqList(SeqList *L)
{
   if(L->length==0)
    printf("不能删除!");
   int j=0;
   int i;
   for(i=1;i<L->length;i++)
   {
       if(L->elem[i]!=L->elem[j])
       {
           L->elem[++j]=L->elem[i];
       }
   }
   L->length=j+1;
}

void Display_SeqList(SeqList L)  //显示顺序表
{
    int i;
    for(i=0;i<L.length;i++)
     {
        printf("%d",L.elem[i]);
     }
}

int main()
{
    SeqList L;
    Init_SeqList(&L);
    printf("初始化\n建立顺序表如下:");
    Insert_SeqList(&L,1,1);
    Insert_SeqList(&L,2,2);
    Insert_SeqList(&L,3,3);
    Insert_SeqList(&L,4,3);
    Insert_SeqList(&L,5,4);
    Insert_SeqList(&L,6,4);
    Insert_SeqList(&L,7,5);
    Insert_SeqList(&L,8,6);
    Insert_SeqList(&L,9,7);
    Insert_SeqList(&L,10,8);
    Display_SeqList(L);
    printf("\n");
    Delete_SeqList(&L);
    Display_SeqList(L);
    return 0;
}

四、编写一个由多个函数构成的完整程序,实现单链表的初始化、建立、按照内容查找、插入节点、删除节点、显示整个链表的操作。

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#define flag 0
typedef struct Lnode
{
    int data;
    struct Lnode *next;
}Lnode,*LinkList;//LinkList说明指针变量,强调它是某个单链表的头指针变量
//Lnode*来定义指向单链表中结点的指针
//Lnode和*LinkList不是变量名而是结构体类型的别名
Lnode *Get_LinkList(LinkList L,int i)//在带头结点单链表中查找第i个数据元素,找到返回其指针,否则返回空
{
    Lnode *p=L;//把p声明为一个可以使用Lnode结构体的结构体变量,p这个变量里就包含了Lnode结构体中所有的变量
    int j=0;
    while(p!=NULL&&j<i)
    {
        p=p->next;
        j++;
    }
    return p;//因为想返回指针,所以函数这样写成指针的形式
}
int Locate_LinkList(LinkList L,int x)
{
    LinkList p;
    int j=1;
    p=L->next;
    while(p!=NULL&&p->data!=x)
    {
        p=p->next;
        j++;
    }
    if(p)
    {
        printf("%d在链表中,是第%d个元素。\n",p->data,j);
        return j;
    }
    else
    {
        printf("该数值不在链表里。\n");
        return 0;
    }
}
int Insert_LinkList(LinkList *L,int i,int x)
{
    Lnode *p,*s;
    p=Get_LinkList((void*)L,i);//函数调用,查找第i位的结点
    if(p==NULL)
    {
        printf("参数i输入有误!\n");
        return 0;
    }
    else
    {
        s=(Lnode*)malloc(sizeof(Lnode));//申请、填装结点
        s->data=x;
        s->next=p->next;
        p->next=s;
        return 1;
    }
}
int Delete_LinkList(LinkList L,int i)
{
    LinkList p,s;
    p=Get_LinkList(L,i-1);
    if(p==NULL)
    {
        printf("待删结点前结点不存在!\n");
        return -1;
    }
    else if(p->next==NULL)
    {
        printf("该结点不存在!\n");
        return 0;
    }
    else
    {
        s=p->next;//s指向第i个结点
        p->next=s->next;//从链表中删除
        free(s);//释放s
        return 1;
    }
}
void Create_LinkList(LinkList *L,int n)//前插法创建带头结点单链表
{
    int i;
    LinkList p;
    *L=(LinkList)malloc(sizeof(Lnode));
    (*L)->next=NULL;//生成头结点
    for(i=n;i>0;--i)
    {
        p=(LinkList)malloc(sizeof(Lnode));//生成新结点
        p->data=i;
        p->next=(*L)->next;//将*p插入原开始结点之前,头结点之后
        (*L)->next=p;
    }
}
void Display_LinkList(LinkList L)
{
    LinkList p;
    p=L;
    while(p->next)
    {
        printf("%d",p->next->data);
        p=p->next;
    }
}
int main()
{
    printf("初始化\n建立单链表如下:\n");
    LinkList L;
    int x,y,cord,i;
    Create_LinkList(&L,4);
    Display_LinkList(L);
    do
    {
        printf("\n          主菜单         \n");
        printf("        1   尾插法插入元素到指定位置     \n");
        printf("        2   删除某一指定元素        \n");
        printf("        3   查找指定元素      \n");
        printf("        0   结束程序        \n");
        printf("------------------------------------\n");
        printf("请输入您选择的菜单号<1,2,3,0>:");
        scanf("%d",&cord);
        switch(cord)
        {
        case 1:
            printf("请输入插入元素位置前序号i:");
            scanf("%d",&x);
            printf("请输入插入的数据 y:");
            scanf("%d",&y);
            Insert_LinkList(&L,x,y);
            printf("单链表输出如下:\n");
            Display_LinkList(L);
            break;
        case 2:
            printf("请输入删除元素序号 x=?");
            scanf("%d",&x);
            Delete_LinkList(L,x);
            printf("单链表输出如下:\n");
            Display_LinkList(L);
            break;
        case 3:
            printf("请输入查找元素值 x:");
            scanf("%d",&x);
            i=Locate_LinkList(L,x);
            break;
        case 0:
            exit(0);
            break;
        default:
            printf("输入有误!");
        }
    }while(cord<=3&&cord>=0);
    return 0;
}

五、建立一个单链表L,已知节点的data域为int,请设计一个尽可能高效的算法,查找链表倒数第K个位置的节点,并返回该节点的data域。

#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode
{
    int data;
    struct Lnode*next;
}Lnode,*LinkList;

void Create_LinkList(LinkList *L,int n)//前插法
{
    int i;
    LinkList p;
    *L=(LinkList)malloc(sizeof(Lnode));
    (*L)->next=NULL;
    for(i=n;i>0;--i)
    {
        p=(LinkList)malloc(sizeof(Lnode));
        p->data=i;
        p->next=(*L)->next;
        (*L)->next=p;
    }
}

int finddata(LinkList L,int k)
{
    Lnode *p1,*p2;
    p1=L;
    p2=L;
    int i=0;
    while(p1->next)
    {
        if(i<k-1)
        {
            p1=p1->next;
            i++;
        }
        else
        {
            p1=p1->next;
            p2=p2->next;
        }
    }
    return p2->data;
}

void Display_LinkList(LinkList L)
{
    LinkList p;
    p=L;
    while(p->next)
    {
        printf("%d",p->next->data);
        p=p->next;
    }
}
int main()
{
    LinkList L;
    Create_LinkList(&L,8);
    Display_LinkList(L);
    printf("\n");
    int k;
    scanf("%d",&k);
    printf("%d",finddata(L,k));
    return 0;
}

六、给定一个单链表,给定两个整数left、right,将该链表的第left和第right个节点的这一部分反转,要求时间复杂度为O(n),空间复杂度为O(1)。

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

typedef struct Lnode
{
    int data;
    struct Lnode*next;
}Lnode,*LinkList;

void Create_LinkList(LinkList *L,int n)//前插法
{
    int i;
    LinkList p;
    *L=(LinkList)malloc(sizeof(Lnode));
    (*L)->next=NULL;
    for(i=n;i>0;--i)
    {
        p=(LinkList)malloc(sizeof(Lnode));
        p->data=i;
        p->next=(*L)->next;
        (*L)->next=p;
    }
}

void changelist(LinkList L,int left,int right)
{
    Lnode *p,*q,*s;
    p=(Lnode*)malloc(sizeof(Lnode));
    q=(Lnode*)malloc(sizeof(Lnode));
    s=(Lnode*)malloc(sizeof(Lnode));
    p=L;
    int i=1;
    for(i=1;i<=right;i++)
    {
        p=p->next;
        if(i==left)
        {
            s->data=p->data;
            q=p;
        }
    }
    q->data=p->data;
    p->data=s->data;
}

void Display_LinkList(LinkList L)
{
    LinkList p;
    p=L;
    while(p->next)
    {
        printf("%d",p->next->data);
        p=p->next;
    }
}

int main()
{
    LinkList L;
    int num;
    scanf("%d",&num);
    Create_LinkList(&L,num);
    Display_LinkList(L);
    printf("\n");
    int left,right;
    scanf("%d",&left);
    scanf("%d",&right);
    changelist(L,left,right);
    Display_LinkList(L);
    return 0;
}

七、已知由如下单链表(a1,a2,a3,a4,…,an),要求编写一个时间复杂度为O(n),空间复杂度为O(1)的算法,将该单链表转换成如下结构(an,an-2,…,a4,a2,a1,a3, …,an-3,an-1)

#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode
{
    int data;
    struct Lnode*next;
}Lnode,*LinkList;

void Create_LinkList(LinkList *L,int n)//前插法
{
    int i;
    LinkList p;
    *L=(LinkList)malloc(sizeof(Lnode));
    (*L)->next=NULL;
    for(i=n;i>0;--i)
    {
        p=(LinkList)malloc(sizeof(Lnode));
        p->data=i;
        p->next=(*L)->next;
        (*L)->next=p;
    }
}

void transform(LinkList L)
{
    int i=1;
    Lnode *p1,*p2,*s;
    p1=L->next;
    p2=p1->next;
    s=L->next;
    while(p2!=NULL)
    {
        if(i%2==1)
        {
            L->next=p2;
            p1->next=p2->next;
            p2->next=s;
            s=L->next;
            p2=p1->next;
            i++;
        }
        else
        {
            p1=p1->next;
            p2=p2->next;
            i++;
        }
    }
}

void Display_LinkList(LinkList L)
{
    LinkList p;
    p=L;
    while(p->next)
    {
        printf("%d",p->next->data);
        p=p->next;
    }
}
int main()
{
    LinkList L;
    int num;
    scanf("%d",&num);
    Create_LinkList(&L,num);
    Display_LinkList(L);
    printf("\n");
    transform(L);
    Display_LinkList(L);
    return 0;
}

八、对于一个双向链表,实现该链表的反转,要求时间复杂度为O(n),空间复杂度为O(1)

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

typedef struct DLnode
{
    int data;
    struct DLnode *prior;
    struct DLnode *next;
}DLnode,*DLinkList;

void Create_DLinkList(DLinkList *L,int n)
{
    int i;
    DLinkList p;
    *L=(DLinkList)malloc(sizeof(DLnode));
    (*L)->next=NULL;
    (*L)->prior=NULL;
    for(i=n;i>0;--i)
    {
        p=(DLinkList)malloc(sizeof(DLnode));
        p->data=i;
        p->next=(*L)->next;
        (*L)->next=p;
        if(p->next!=NULL)
        {
            p->next->prior=p;
        }
        p->prior=*L;
    }
}

void Reverse(DLinkList *L)
{
    DLnode *p=(*L)->next;
    DLnode *q;
    (*L)->next=NULL;
    while(p!=NULL)
    {
        q=p->next;
        p->next=(*L)->next;
        p->prior=q;
        (*L)->next=p;
        p=q;
    }
}

void Display_DLinkList(DLinkList L)
{
    DLinkList p;
    p=L->next;
    while(p)
    {
        printf("%d",p->data);
        p=p->next;
    }
}

int main()
{
    DLinkList L;
    int num;
    scanf("%d",&num);
    Create_DLinkList(&L,num);
    Display_DLinkList(L);
    printf("\n");
    Reverse(&L);
    Display_DLinkList(L);
    return 0;
}

九、将一个循环链表表示的稀疏多项式分解成两个多项式,使得这两个多项式中各自仅含奇数项或者偶数项,要求空间复杂度为 O(1)。

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

int num=0;

typedef struct cNode
{
	int data1;
	int data2;
	struct cNode *next;
}cNode,*CircleList;

void Initlist(CircleList *L)
{
	*L=(CircleList)malloc(sizeof(cNode));
	(*L)->next=*L;
}

void Create_CircleList(CircleList L)
{
	int i=0;
	cNode *p,*s;
	p=L;
	int a,b;
	while(i!=num)
	{
		scanf("%d%d",&a,&b);
		s=(cNode*)malloc(sizeof(cNode));
		s->data1=a;
		s->data2=b;
		p->next=s;
		p=s;
		i++;
	}
  p->next=L;
}

void Divide(CircleList L)
{
	cNode *p,*q,*s;
	int i=0;
	s=L;
	q=L->next;
	p=L;
	while(s->next!=L)
   	  {
		s=s->next;
		if(s->data2%2==0)
		{
			i++;
		}
      }
    while(i!=0)
     {
       if(q->data2%2==0)
        {
	    	p->next=q->next;
	    	q->next=L;
	    	s->next=q;
	    	s=q;
	    	q=p->next;
	    	i--;
        }
       else
          {
          	p=p->next;
          	q=p->next;
		  }

     }
}

void view(CircleList L)
{
	cNode *p;
	p=L->next;
	printf("奇数次多项式为:\n");
	int flag=0;
	while((p->data2)%2!=0)
	  {
	  	if(flag==0)
	  	  {
	  	  	printf("%dx^%d",p->data1,p->data2);
		  }
		else
	      {
			printf("+%dx^%d",p->data1,p->data2);
		  }
		p=p->next;
		flag++;
	  }
	printf("\n");
	printf("偶数次多项式为:\n");
	while(p!=L)
	{
		printf("%dx^%d",p->data1,p->data2);
		if(p->next!=L)
		  {
		  	printf("+");
		  }
		p=p->next;
	}
  printf("\n");
}
int main()
{
	CircleList L;
	Initlist(&L);
	printf("输入多项式的总个数:");
	scanf("%d",&num);
	printf("请依次输入每个单项式的系数、指数:");
	Create_CircleList(L);
	Divide(L);
	view(L);
	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一道关于大数四则运算的题目,需要使用双向循环链表来存储大数,每个节点包含一个整型变量,实现指数形式的表示法。 具体实现思路如下: 1. 定义一个结构体表示链表的节点,包含一个整型变量和两个指针分别指向前驱节点和后继节点。 2. 定义一个函数来创建链表,该函数使用一个字符串表示大数,将其转化为链表的形式存储。 3. 定义四个函数分别实现大数的加、减、乘、除四种运算,这四个函数的实现都需要对链表进行操作。 4. 定义一个函数实现大数的幂次运算,该函数使用快速幂算法实现,也需要对链表进行操作。 5. 定义一个函数实现链表的输出,将链表转换为指数形式输出。 具体实现过程需要注意链表的初始化、插入、删除等操作,以及处理进位和借位的情况。同时,为了方便计算,可以将大数转化为以10的指数幂为底的指数形式,这样可以方便地进行数位的对齐和运算。 以下是一个可能的C语言实现示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #define BASE 10000 #define MAX_DIGITS 100 typedef struct Node { int val; struct Node *prev, *next; } Node; typedef struct { Node *head, *tail; int len; } BigInt; Node *new_node(int val) { Node *node = (Node *)malloc(sizeof(Node)); node->val = val; node->prev = node->next = NULL; return node; } BigInt *new_bigint() { BigInt *bigint = (BigInt *)malloc(sizeof(BigInt)); bigint->head = bigint->tail = NULL; bigint->len = 0; return bigint; } void insert_front(BigInt *bigint, int val) { Node *node = new_node(val); if (bigint->head == NULL) { bigint->head = bigint->tail = node; } else { node->next = bigint->head; bigint->head->prev = node; bigint->head = node; } bigint->len++; } void insert_back(BigInt *bigint, int val) { Node *node = new_node(val); if (bigint->tail == NULL) { bigint->head = bigint->tail = node; } else { node->prev = bigint->tail; bigint->tail->next = node; bigint->tail = node; } bigint->len++; } void remove_front(BigInt *bigint) { if (bigint->head == NULL) return; Node *node = bigint->head; bigint->head = node->next; if (bigint->head != NULL) bigint->head->prev = NULL; else bigint->tail = NULL; bigint->len--; free(node); } void remove_back(BigInt *bigint) { if (bigint->tail == NULL) return; Node *node = bigint->tail; bigint->tail = node->prev; if (bigint->tail != NULL) bigint->tail->next = NULL; else bigint->head = NULL; bigint->len--; free(node); } void clear(BigInt *bigint) { while (bigint->len > 0) remove_front(bigint); } BigInt *from_str(char *str) { BigInt *bigint = new_bigint(); int len = strlen(str); int i, j, n; for (i = len - 1; i >= 0; i -= 4) { int val = 0; for (j = 0, n = 1; j < 4 && i - j >= 0; j++, n *= 10) { val += (str[i - j] - '0') * n; } insert_front(bigint, val); } while (bigint->len > 1 && bigint->head->val == 0) remove_front(bigint); return bigint; } char *to_str(BigInt *bigint) { char *str = (char *)malloc(sizeof(char) * (bigint->len * 4 + 1)); int i = 0; Node *node = bigint->head; while (node != NULL) { if (node != bigint->head) { sprintf(str + i, "%04d", node->val); i += 4; } else { sprintf(str + i, "%d", node->val); i += (node->val == 0 ? 1 : (int)log10(node->val) + 1); } node = node->next; } str[i] = '\0'; return str; } int compare(BigInt *a, BigInt *b) { if (a->len != b->len) return (a->len > b->len ? 1 : -1); Node *a_node = a->head, *b_node = b->head; while (a_node != NULL && b_node != NULL) { if (a_node->val != b_node->val) return (a_node->val > b_node->val ? 1 : -1); a_node = a_node->next; b_node = b_node->next; } return 0; } void add(BigInt *a, BigInt *b, BigInt *result) { int carry = 0; Node *a_node = a->tail, *b_node = b->tail; while (a_node != NULL || b_node != NULL || carry != 0) { int sum = carry; if (a_node != NULL) sum += a_node->val; if (b_node != NULL) sum += b_node->val; insert_front(result, sum % BASE); carry = sum / BASE; if (a_node != NULL) a_node = a_node->prev; if (b_node != NULL) b_node = b_node->prev; } } void subtract(BigInt *a, BigInt *b, BigInt *result) { int borrow = 0; Node *a_node = a->tail, *b_node = b->tail; while (a_node != NULL || b_node != NULL || borrow != 0) { int diff = borrow; if (a_node != NULL) diff += a_node->val; if (b_node != NULL) diff -= b_node->val; if (diff < 0) { diff += BASE; borrow = -1; } else { borrow = 0; } insert_front(result, diff); if (a_node != NULL) a_node = a_node->prev; if (b_node != NULL) b_node = b_node->prev; } while (result->len > 1 && result->head->val == 0) remove_front(result); } void multiply(BigInt *a, BigInt *b, BigInt *result) { clear(result); int i, j; for (i = 0; i < a->len; i++) { int carry = 0; BigInt *temp = new_bigint(); for (j = 0; j < i; j++) insert_back(temp, 0); Node *b_node = b->tail; while (b_node != NULL || carry != 0) { int prod = carry; if (b_node != NULL) prod += b_node->val * a->head->val; insert_front(temp, prod % BASE); carry = prod / BASE; if (b_node != NULL) b_node = b_node->prev; } add(result, temp, result); clear(temp); } } void divide(BigInt *a, BigInt *b, BigInt *quo, BigInt *rem) { clear(quo); clear(rem); BigInt *dividend = new_bigint(); Node *node = a->head; while (node != NULL) { insert_back(dividend, node->val); node = node->next; int i; for (i = 0; i < BASE; i++) { multiply(b, rem, rem); add(rem, new_bigint(), rem); add(rem, new_node(i), rem); if (compare(rem, b) >= 0) break; } insert_front(quo, i); subtract(rem, b, rem); } while (quo->len > 1 && quo->head->val == 0) remove_front(quo); while (rem->len > 1 && rem->head->val == 0) remove_front(rem); free(dividend); } void pow_helper(BigInt *a, int n, BigInt *result) { if (n == 0) { insert_front(result, 1); return; } pow_helper(a, n / 2, result); multiply(result, result, result); if (n % 2 == 1) { BigInt *temp = new_bigint(); copy(a, temp); multiply(result, temp, result); clear(temp); } } void pow(BigInt *a, int n, BigInt *result) { clear(result); pow_helper(a, n, result); } int main() { BigInt *a = from_str("123456789012345678901234567890"); BigInt *b = from_str("987654321098765432109876543210"); BigInt *c = new_bigint(); BigInt *d = new_bigint(); BigInt *e = new_bigint(); add(a, b, c); subtract(a, b, d); multiply(a, b, e); char *a_str = to_str(a); char *b_str = to_str(b); char *c_str = to_str(c); char *d_str = to_str(d); char *e_str = to_str(e); printf("%s + %s = %s\n", a_str, b_str, c_str); printf("%s - %s = %s\n", a_str, b_str, d_str); printf("%s * %s = %s\n", a_str, b_str, e_str); pow(a, 3, c); char *c_pow_str = to_str(c); printf("%s ^ 3 = %s\n", a_str, c_pow_str); free(a_str); free(b_str); free(c_str); free(d_str); free(e_str); free(c_pow_str); clear(a); clear(b); clear(c); clear(d); clear(e); free(a); free(b); free(c); free(d); free(e); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值