您的位置:首页 > 编程语言 > C语言/C++

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: