C语⾔实现复数数据结构⽂章⽬录
19m094
复数数据结构
头⽂件
#ifndef _COMPLEX_H_
#define _COMPLEX_H_
typedef struct complex
{
double Realpart;
double Imagepart;
} Complex;//复数结构
typedef struct node
{
Complex complex;
struct node* next;
} Node;//节点
typedef struct linklist
{
Node* front;//头指针
int items;//节点数量
} Linklist;//头节点
/*操作:初始化链表 */
/
*前提: pL指向⼀个链表 */
/*后件:链表初始化为空 */
void InitializeList(Linklist* pL);
/*操作:将复数节点插⼊指定位置 */
/*前提: pL指向⼀个复数链表,i为插⼊位置 */
/*后件:复数节点插⼊链表 */
void InsertNode(Linklist* pL,int i);
/*操作:获取指定位置的复数 */
/*前提: pL指向⼀个链表,i为指定位置 */
/*后件:返回⼀个复数 */
Complex GetComplex(Linklist* pL,int i);
/
*操作:获取两个复数并计算和 */
/*前提:复数链表存在且不为空 */
/*后件:返回计算结果 */
Complex Sum(Linklist* pL,int index1,int index2);
/*操作:获取两个复数并计算差 */
/*前提:复数链表存在且不为空 */
/*后件:返回计算结果 */
Complex Difference(Linklist* pL,int index1,int index2);
/*操作:获取两个复数并计算积 */
/*前提:复数链表存在且不为空 */
/*后件:返回计算结果 */
Complex Multiply(Linklist* pL,int index1,int index2);
/*操作:将指定位置的复数节点删除 */
/*前提: pL指向⼀个复数链表 */
/*后件:复数节点被删除 */
void DeleteNode(Linklist* pL,int i);
/*操作:将指定位置的复数修改 */
/*前提: pL指向⼀个复数链表 */
/*后件:复数被修改 */
void ChangeComplex(Linklist* pL,int i);
/*操作:遍历链表打印节点中复数 */
/*前提: pL指向⼀个复数链表 */
/
*后件:打印已有复数 */
void Print(Linklist* pL);
/*操作:将链表内存释放 */
/*前提: pL指向⼀个复数链表 */
/*后件:成为空表 */
void DestroyList(Linklist* pL);
/*操作:获取复数实部 */
/*前提:传⼊⼀个复数 */
/*后件:返回实部 */
double Getreal(Complex c);
/*操作:获取复数虚部 */
/
*前提:传⼊⼀个复数 */
/*后件:返回虚部 */
double Getimage(Complex c);
#endif// !_COMPLEX_H_
函数⽂件
#include<stdio.h>
#include<stdlib.h>
#include"complex.h"
void InitializeList(Linklist* pL)
{
pL->front =NULL;
pL->items =0;
}
void InsertNode(Linklist* pL,int i)
{
Node* pN,* pC;
if(!pL->front)
{//空表
pL->front =(Node*)malloc(sizeof(Node));
pL->items++;
printf(" Realpart: ");
scanf("%lf",&(pL->front->complex.Realpart)); printf("Imagepart: ");
scanf("%lf",&(pL->front->complex.Imagepart)); pL->front->next =NULL;
}
else
{//其他位置插⼊
int j;
pN = pL->front;
pL->items++;
for(j =1; j < i -1; j++)
{
pN = pN->next;
pC =(Node*)malloc(sizeof(Node));
printf(" Realpart: ");
scanf("%lf",&(pC->complex.Realpart));
printf("Imagepart: ");
scanf("%lf",&(pC->complex.Imagepart));
pC->next = pN->next;
pN->next = pC;
}
}
Complex GetComplex(Linklist* pL,int i)
{
int j;
Node* pN;
pN = pL->front;
for(j =1; j < i; j++)
{
pN = pN->next;
}
return pN->complex;
}
Complex Sum(Linklist* pL,int index1,int index2)
{
Complex c, c1, c2;
c1 =GetComplex(pL, index1);
c2 =GetComplex(pL, index2);
c.Realpart = c1.Realpart + c2.Realpart;
c.Imagepart = c1.Imagepart + c2.Imagepart;
return c;
}
Complex Difference(Linklist* pL,int index1,int index2)
{
Complex c, c1, c2;
c1 =GetComplex(pL, index1);
c2 =GetComplex(pL, index2);
c.Realpart = c1.Realpart - c2.Realpart;
c.Imagepart = c1.Imagepart - c2.Imagepart;
return c;
}
Complex Multiply(Linklist* pL,int index1,int index2)
{
Complex c, c1, c2;
c1 =GetComplex(pL, index1);
c2 =GetComplex(pL, index2);
c.Realpart = c1.Realpart * c2.Realpart - c1.Imagepart * c2.Imagepart;
c.Imagepart = c1.Realpart * c2.Imagepart + c1.Imagepart * c2.Realpart; return c;
}
void DeleteNode(Linklist* pL,int i)
{
int j;
Node* pN,* pC;
pL->items -=1;
pN = pL->front;
if(i ==1)
{
pC = pN;
pL->front = pN->next;
free(pC);
}
{
for(j =1; j < i -1; j++)
{
pN = pN->next;
}
pC = pN->next;
pN->next = pN->next->next;
free(pC);
}
}
void ChangeComplex(Linklist* pL,int i)
{
int j;
Node* pN;
pN = pL->front;
for(j =1; j < i; j++)
{
pN = pN->next;
}
printf("现在输⼊要修改的复数的实部与虚部\n");
printf(" Realpart: ");
scanf("%lf",&(pN->complex.Realpart));
printf("Imagepart: ");
scanf("%lf",&(pN->complex.Imagepart));
}
void Print(Linklist* pL)
{
Node* pN;
pN = pL->front;
while(pN)
{
printf("C = %lf + (%lf)i\n",Getreal(pN->complex),Getimage(pN->complex)); pN = pN->next;
}
}
void DestroyList(Linklist* pL)
{
int i;
for(i = pL->items; i >1; i--)
{
DeleteNode(pL, i);
}
free(pL->front);
}
double Getreal(Complex c)
{
return c.Realpart;
}
double Getimage(Complex c)
{
return c.Imagepart;
}
驱动⽂件
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include"complex.h"
int main(void)
{
int choice, index, index1, index2;
Linklist L;
Complex complex;
InitializeList(&L);
printf("\n现在有%d个节点位于链表", L.items);
printf("\n---------------菜单---------------\n1:复数求和 2:复数求差\n3:复数求积 4:插⼊节点\n\ 5:修改复数 6:删除节点\n7:打印已有复数 8:退出程序\n输⼊数字选择指定的操作:");
while((scanf("%d",&choice)==1)&&(choice <=8&& choice >=1))
{
fflush(stdin);//清空缓冲区
switch(choice)
{
case1:
printf(" 请输⼊加数在链表中的序号:");c语言struct头文件
scanf("%d",&index1);
fflush(stdin);
printf("请输⼊被加数在链表中的序号:");
scanf("%d",&index2);
fflush(stdin);
if(index1 > L.items || index2 > L.items || index1 <1|| index2 <1)
{
printf("⽆效数据,请确认节点数量后重新输⼊\n");
break;
}
complex =Sum(&L, index1, index2);
printf("C = %lf + (%lf)i\n",Getreal(complex),Getimage(complex));
break;
case2:
printf("请输⼊被减数在链表中的序号:");
scanf("%d",&index1);
fflush(stdin);
printf(" 请输⼊减数在链表中的序号:");
scanf("%d",&index2);
fflush(stdin);
if(index1 > L.items || index2 > L.items || index1 <1|| index2 <1)
{
printf("⽆效数据,请确认节点数量后重新输⼊\n");
break;
}
complex =Difference(&L, index1, index2);
printf("C = %lf + (%lf)i\n",Getreal(complex),Getimage(complex));
break;
case3:
printf(" 请输⼊乘数在链表中的序号:");
scanf("%d",&index1);
fflush(stdin);
printf("请输⼊被乘数在链表中的序号:");
scanf("%d",&index2);
fflush(stdin);
if(index1 > L.items || index2 > L.items || index1 <1|| index2 <1)
{
printf("⽆效数据,请确认节点数量后重新输⼊\n");
break;
}
complex =Multiply(&L, index1, index2);
printf("C = %lf + (%lf)i\n",Getreal(complex),Getimage(complex));
break;
case4:
printf("请问要在第⼏个位置插⼊新节点:");
scanf("%d",&index);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论