C语言来实现链表的相加基本操作 桂林电子科技大学 大二实验

C语言实现链表的基本操作

基本描述:用c语言来实现链表的基本操作,包括插入,删除,排列,两个链表的相加减
代码:
里面都有详细的解析了
#include<stdio.h>
#include <stdlib.h>
#include<malloc.h>
#include<time.h>
typedef struct tagNode
{
float coef; //系数
int exp; //x的指数
tagNode *next;
}pNode, Node;


pNode *CreateNewList(); //创建一个新的节点,若申请空间成功则返回节点的指针,若失败则返回NULL
bool InserNode(Node *head, float coef, int exp); //顺序插入链表,coef为链表的系数,x为指数,若成功则返回true,否则返回false;
void CombineRepeatedElement(Node *head); //将一个排序好的链表重复系数的链表合并
void PolyAdd(Node *pa, Node *pb); //将两个链表相加,结果放在pa中
void DecPoly(Node *pa, Node *pb); //链表pa-pb,将结果放在pa中
void ListShow(Node *head); //根据头指针来显示链表中的节点的数据
void ListDelete(Node *head); //程序结束是将链表的内容清空,以免发生内存泄漏
int main()
{
float coef;
int exp;
pNode *pa = CreateNewList();
pNode *pb = CreateNewList();
pNode *pc = CreateNewList();
srand(time(NULL));
for (int i = 0; i < 5; i++)//创建pa链表,并显示
{
coef = rand() % 100;
exp = rand() % 20;
InserNode(pa, coef, exp);
}
printf("pa: ");
ListShow(pa);


srand(time(NULL));
for (int i = 0; i < 8; i++)//创建pb链表,并显示
{
coef = rand() % 100;
exp = rand() % 20;
InserNode(pb, coef, exp);
}
printf("pb: ");
ListShow(pb);
srand(time(NULL));
for (int i = 0; i < 8; i++)//创建pc链表,并显示
{
coef = rand() % 100;
exp = rand() % 30;
InserNode(pc, coef, exp);
}
printf("pc :");
ListShow(pc);
CombineRepeatedElement(pa);//分别将顺序插入后的pa链表相同指数的项合并,并显示
printf("合并后pa: ");
ListShow(pa);


CombineRepeatedElement(pb);//分别将顺序插入后的pb链表相同指数的项合并,并显示
printf("合并后pb: ");
ListShow(pb);

CombineRepeatedElement(pc);
printf("合并后pc: ");
ListShow(pc);
PolyAdd(pa, pb);//多项式pa与pb相加
printf("pa+pb=: ");
ListShow(pa);
DecPoly(pa, pc);//多项式pa-pc
printf("pa-pc=: ");
ListShow(pa);
ListDelete(pa);//程序结束后将pa链表删除,避免内存泄漏
return 0;
}


pNode *CreateNewList() // 创建一个新的节点,若申请空间成功则返回节点的指针,若失败则返回NULL
{
pNode *head = (pNode*)malloc(sizeof(pNode));
if (head == NULL)
{
printf("没有申请空间");
return NULL;
}
else
{
head->next = NULL;
return head;
}
}
bool InserNode(Node *head, float coef, int exp) //顺序插入链表,coef为链表的系数,x为指数,若成功则返回true,否则返回false;
{
Node *newnode = (Node*)malloc(sizeof(Node));
if (newnode == NULL)//申请不到空间,则返回
{
return false;
}
newnode->coef = coef;
newnode->exp = exp;
newnode->next = NULL;
Node *p = head->next;
if (p == NULL)//如果链表为空,将newnode插入头结点后面
{


head->next = newnode;


return true;
}
if (newnode->exp <= p->exp)//如果newnode的系数大于头结点的系数,将newnode插入头结点前面
{
newnode->next = p;
head->next = newnode;
return true;
}
Node *q = p->next;
while (q != NULL)//寻找插入的位置
{
if (p->exp <= exp&&q->exp >= exp)
{
break;
}
p = q;
q = q->next;
}
if (q == NULL)//如果插入的借点位于链表末尾,将newnode插入到链表的末尾返回
{
p->next = newnode;
return true;
}
p->next = newnode;//刚好插入适合的地方
newnode->next = q;
return true;
}


void CombineRepeatedElement(Node *head) //将一个排序好的链表重复系数的链表合并
{
bool falg = true;
Node *p = head->next;
if (p == NULL)//如果链表为空
{
return;
}
Node *u;
Node *q = p->next;
while (q) //循环寻找指数相同的节点,flag为标志,若找到系数相同的节点则falg为true
{
if (p->exp == q->exp)
{
p->coef += q->coef;
u = q;
q = q->next;
p->next = q;
free(u);
falg = true;
}
if (!falg)
{
p = q;
q = q->next;
}
falg = false;
}
}
void PolyAdd(Node *pa, Node *pb) //将两个链表相加,结果放在pa中
{
Node *p = pa->next;//链表1,将来的结果也放在此
Node *q = pb->next;//链表2
Node *pre = pa;
Node *u; //临时用
float x;
while (p != NULL && q != NULL)//当两个链表都不为空
{
if (p->exp < q->exp)//链表1指数小于链表2指数
{
pre = p;
p = p->next;
}
else if (p->exp == q->exp)//若两链表指数相等
{
x = p->coef + q->coef;
if (x != 0) //相加后系数不为0
{
p->coef = x;
pre = p;
}
else                                //若相加后,系数是0,删除链表1结点
{
pre->next = p->next;
free(p);
}
p = pre->next;//p指向要比较的下一结点
u = q;
q = q->next;
free(u); //删除链表2中的结点
}
else //如果链表2的当前节点指数小
{
u = q->next;
q->next = p;
pre->next = q;
pre = q;
q = u;
}
}
if (q) //如果链表2比链表1长
{
pre->next = q;
}
free(pb);
}
void ListShow(Node *head) //根据头指针来显示链表中的节点的数据
{
Node *p = head->next;
while (p)
{
if (p == head->next)//如果在头结点后面则不需要加上+号
{
if (p->exp == 0)//如果多项式的指数为0,则只输出常数
{
printf("%.2f\n ", p->coef);
}
if (p->coef > 0)//如果系数大于0而且指数不为0,则正常输出
{
printf("%.2fX^%d  ", p->coef, p->exp);
}
else //如果系数是负数,而且指数不为0,则不输出+ 
{
printf("%.2fX^%d  ", p->coef, p->exp);
}
p = p->next;
}
if (p->exp == 0)//如果多项式的指数为0,则只输出常数
{
printf("+%.2f\n ", p->coef);
continue;
}
if (p->coef > 0)//如果系数大于0而且指数不为0,则正常输出
{
printf("+%.2fX^%d  ", p->coef, p->exp);
}
else //如果系数是负数,而且指数不为0,则不输出+ 
{
printf("%.2fX^%d  ", p->coef, p->exp);
}
p = p->next;
}
printf("\n\n");
}


void ListDelete(Node *head) //程序结束是将链表的内容清空,以免发生内存泄漏
{
Node *p;
while (head)
{
p = head;
head = head->next;
free(p);
}
}
void DecPoly(Node *pa, Node *pb) //将链表pa-pb,将结果放在pa中,首先将pb的系数都取反,让后再与pa相加
{
Node *r = pb->next;
while (r) //将pb的系数取反
{
r->coef = -r->coef;
r = r->next;
}
PolyAdd(pa, pb);//调用加法程序将链表pa与pb相加
}

还有另外的一种链表的情形为头节点为空时的操作:
#include<stdio.h>
#include<malloc.h>
typedef struct Node
{
int data;
Node *next;
}Pnode;
void insert(Node **head,int data)
{
Node *newnode=(Node*)malloc(sizeof(Node));
newnode->data=data;
newnode->next=NULL;
if(*head==NULL)
{
*head=newnode;
return ;
}
}
int main()
{
Node *head=NULL;//ode*)malloc(sizeof(Node));
insert(&head,11);
printf("%d\n",head->data);
}

这需要用到指针的指针操作了


这是我们实验的操作,有什么不懂的可以与联系 2444398672@qq.com



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值