顺序表示的线性表——顺序表5
程序员文章站
2022-06-05 18:03:56
...
试设计一种表示任意长度的整数的数据结构,计算任意给定的两个整数之和的算法。
SeqList.h
#pragma once
#define ListSize 200
#include <iostream>
using namespace std;
typedef int DataType;
typedef struct
{
DataType list[ListSize];
int length;
}SeqList;
//初始化线性表
void InitList(SeqList *L)
{
L->length = 0;//把线性表长度置为0
}
//判断线性表是否为空,线性表为空返回1,否则返回0
int ListEmpty(SeqList L)
{
if (L.length == 0)
return 1;
else
return 0;
}
//按照序号查找
int GetElem(SeqList L, int i, DataType *e)
/*查找线性表中第i个元素,查找成功返回给e,并返回1表示成功,否则返回-1,表示失败*/
{
if (i<1 || i>L.length)
return -1;
else
*e = L.list[i - 1];
return 1;
}
//按照内容查找
int LocateElem(SeqList L, DataType e)
{
int i;
for (i = 0; i < L.length; i++)/*从第一个元素开始与e进行比较*/
if (L.list[i] == e) /*若存在与e相等的元素*/
return i + 1; /*返回该元素的在线性表中的序号*/
return 0; /*否则,返回0 */
}
//插入操作
int InsertList(SeqList *L, int i, DataType e)
/*在顺序表中的第i个位置插入元素e,插入成功返回1,插入不合法返回-1,顺序表满返回0.*/
{
int j;
if (i<1||i>L->length+1)/*在插入元素前,判断插入位置是否合法*/
{
cout <<"插入位置"<<i<<"不合法!" << endl;
return -1;
}
else if (L->length>=ListSize)/*在插入元素之前,判断顺序表是否已经满,不能插入元素*/
{
cout << "顺序表已经满,不能插入元素。" << endl;
return 0;
}
else
{
for (j = L->length; j >= i; j--)
/*将第i个位置以后的元素依次后移*/
{
L->list[j] = L->list[j - 1];
}
L->list[i - 1] = e;
L->length = L->length + 1;
return 1;
}
}
/*删除操作,删除第i个元素*/
int DeleteList(SeqList *L, int i, DataType *e)
{
int j;
if (L->length<=0)
{
cout << "顺序表表已空,不能进行删除!" << endl;
return 0;
}
else if (i<1||i>L->length)
{
cout << "删除位置不合适!" << endl;
return -1;
}
else
{
*e = L->list[i - 1];
for (j = i; j <= L->length - 1;j++)
{
L->list[j - 1] = L->list[j];
}
L->length = L->length - 1;
return 1;
}
}
/*求线性表的长度*/
int ListLength(SeqList L)
{
return L.length;
}
/*清空顺序表*/
void ClearList(SeqList *L)
{
L->length = 0;
}
main.cpp
/*计算任意长度的整数之和,解决C++只提供-2^(31)——+2^(31)*/
#include"SeqList.h"
#define MaxLen 100
typedef int sqlist[MaxLen];
int input(sqlist A)
{
int i;
for ( i = 0; i < MaxLen; i++)
{
A[i] = 0;
}
cout << "输入一个正整数的各位(输入-1结束)" << endl;
i = 0;
while (1)
{
//cin >>"%d">> &A[i];
scanf_s("%d", &A[i]);
if (A[i] < 0)
{
break;
}
i++;
}
return i;
}
void output(sqlist A, int low, int high)
{
int i;
for ( i = low; i < high; i++)
{
cout << A[i] << " ";
}
cout << endl;
}
void move(sqlist A, int na)
{
int i;
for ( i = 0; i < na; i++)
{
A[MaxLen - i - 1] = A[na - i - 1];
}
}
int add(sqlist *A, int na, sqlist B, int nb)
{
int nc, i, j, length = 0;
if (na > nb)
{
nc = na;
}
else
{
nc = nb;
}
move(*A, na);
move(B, nb);
for ( i = MaxLen-1; i >= MaxLen-nc; i--)
{
j = (*A)[i] + B[i];
if (j>9)
{
(*A)[i - 1] = (*A)[i - 1] + 1;
(*A)[i] = j - 10;
}
else
{
(*A)[i] = j;
}
if (i==MaxLen-nc)
{
if (j>9)
{
(*A)[i - 1] = 1;
length = nc + 1;
}
else
{
length = nc;
}
}
}
return length;
}
void main()
{
sqlist A, B;
int na, nb, nc;
na = input(A);
nb = input(B);
cout << "整数A:" ;
output(A, 0, na);
cout << "整数B:" ;
output(B, 0, nb);
nc = add(&A, na, B, nb);
cout << "相加后的结果:" << " ";
output(A, MaxLen - nc, MaxLen);
//getchar();
system("pause");
}
结果:
上一篇: 顺序表示的线性表——顺序表1
下一篇: 顺序表示的线性表——顺序表2