C语言来实现链表的相加基本操作 桂林电子科技大学 大二实验
2015-05-16 08:39
671 查看
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
基本描述:用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
相关文章推荐
- C语言实现链表的基本操作
- 双向循环链表基本操作的实现(C语言)
- 数据结构--单链表的基本操作(C语言实现)
- C语言实现单链表——之基本操作1
- C语言 链表的基本操作实现 源码
- C语言实现双向链表的基本操作
- c语言实现双向链表的基本操作
- 单向链表基本操作(C语言实现)
- C语言实现链表基本操作
- c语言实现循环链表的基本操作
- 单链表的基本操作大全之C语言实现(二)
- 链表的基本操作(创建,查找指定位置元素,删除指定元素,插入,倒置,去重,求集合的差,分别交换结点与交换结点值实现的冒泡排序,将两个有序链表合并成一个有序链表)c语言实现
- 算法与数据结构-单向链表的基本操作C语言实现
- 双向链表的C语言实现与基本操作(二)
- 学习笔记——C语言实现单链表的基本操作:创建、输出、插入结点、删除结点、逆序链表
- 单链表基本操作示例1[C语言实现]
- C语言实现单链表(带头结点)的基本操作
- C语言实现,无头结点不带环的单向链表的基本操作
- 单向链表的C语言实现与基本操作
- 单链表的基本操作(C语言实现)