链表操作

GPU小码农 2013-10-11 08:12:07

//已知:
struct Polynomial
{
int coef; //系数
int expn; //指数
struct Polynomial* next;
};
/*该函数用于实现合并同类项的第二步:(第一步系数相加)去掉相同项(p->expn == q->expn) 。为什么程序运行后自动停止呢?*/
void Delete(struct Polynomial * la )
{
struct Polynomial *p,*q;
p=la;
if(la)
{
do
{
q=p->next;
while(p->expn == q->expn && q)
{
p->next =q->next;
free(q);
q=p->next;
}
p=p->next;
}while(p->next);
printf("\nxx");
}
else exit(1);

}
...全文
151 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
lm_whales 2013-10-12
  • 打赏
  • 举报
回复
先保证逻辑正确,再写代码
合并同类项
struct Polynomial { 
int coef;    //系数 
int expn;    //指数 
struct Polynomial* next; 
}; 

bool MergeNode( Polynomial *a, Polynomial *b)
{
      assert(a && b); 
      //if(!a ||!b)return false;         
      if(a->expn == b->expn){//指数相等,需要合并
           a->coef += b->coef;   //合并同类项的数学意义,系数相加。
           return true;      //返回true,表示执行了合并运算
      }
      return false;    //返回false,表示没有,也不需要,合并。
}

Polynomial * MergeList( Polynomial *a)
{     
      assert(a );
      if(!a)return NULL;         
      Polynomial *p=a,*q,*r;//当前节点p 初始化为a,前向指针r,要合并的节点指针q;
      do{
      r = p;  //从下各节点开始,依次合并到本节点,前指针就是置为当前节点。
      while(q = r->next ){ //下个节点是合并对象。
           if(MergeNode( p,q)){     //需要合并,合并之并,删除被合并的节点
               r ->next = q->next;  //取下节点
               free(q);             //释放内存      
           }else {                  //不需要合并,不合并,向下走   
               r = r->next;         //没合并,到下个节点,看看 
           };             
      }while(p = p->next);       
      return a; 
}
赵4老师 2013-10-12
  • 打赏
  • 举报
回复
引用 5 楼 edwardvsnc 的回复:
[quote=引用 4 楼 huiguimoyu 的回复:] [quote=引用 2 楼 edwardvsnc 的回复:] while(p->expn == q->expn && q) 如果 q为NULL,你的程序会Crash 改成这样好点while(q && p->expn == q->expn)
这有区别吗?[/quote] q && q->expn 如果q为NULL, q->expn 就不会执行。 不过我忘了这个是不是标准里的了。[/quote] 是。 逻辑短路
buyong 2013-10-11
  • 打赏
  • 举报
回复
单步调试
wwwang89123 2013-10-11
  • 打赏
  • 举报
回复
那闯 2013-10-11
  • 打赏
  • 举报
回复
引用 4 楼 huiguimoyu 的回复:
[quote=引用 2 楼 edwardvsnc 的回复:] while(p->expn == q->expn && q) 如果 q为NULL,你的程序会Crash 改成这样好点while(q && p->expn == q->expn)
这有区别吗?[/quote] q && q->expn 如果q为NULL, q->expn 就不会执行。 不过我忘了这个是不是标准里的了。
GPU小码农 2013-10-11
  • 打赏
  • 举报
回复
引用 2 楼 edwardvsnc 的回复:
while(p->expn == q->expn && q) 如果 q为NULL,你的程序会Crash 改成这样好点while(q && p->expn == q->expn)
这有区别吗?
GPU小码农 2013-10-11
  • 打赏
  • 举报
回复
引用 1 楼 AnYidan 的回复:
自动停止 还是异常退出,跟踪看看
异常退出啊!我贴出渣代码,请帮我看看,谢谢!这个程序的功能是实现多项式的相加减,链表存储结构。
#include<stdio.h>
#include<stdlib.h>
struct Polynomial
{
int coef;	//系数
int expn;	//指数
struct Polynomial* next;
};
#define LEN sizeof(struct Polynomial)
int n=0;

///////////////////////////////////////////////////
//函数声明:
struct Polynomial * Creat();					//建立一个多项式
void Print(struct Polynomial *head);			//打印出多项式
struct Polynomial * AddPolyn(struct Polynomial *la,struct Polynomial *lb,struct Polynomial *lc);//合并操作
void Add(struct Polynomial * la,char way);		//系数计算操作
void Delete(struct Polynomial * la );			//化简操作
///////////////////////////////////////////////////
void main()
{
	struct Polynomial *la,*lb,*lc;
	la = Creat();
 	Print(la);
 	lb = Creat();
 	lc = AddPolyn(la,lb,lc);
 	Add(lc,'+');
	Print(lc);
	Delete(lc);
	Print(lc);

}
////////////////////////////////////////////////
struct Polynomial * Creat()					//建立一个多项式
{
	struct Polynomial *head;
	struct Polynomial *p1,*p2;
	int length;
 	printf("请输入总项数n=");
	scanf("%d",&length);
	if(length>0)
	{
		p1=p2=(struct Polynomial *)malloc(LEN);
 		printf("请输入第1项的系数,以及第1项的未知数的指数:");
		scanf("%d %d",&p1->coef,&p1->expn);
		head=NULL;
		while(p1->coef!=0)
		{
			n=n+1;
			if(n==1)head=p1;
			else p2->next=p1;
			p2=p1;
			p1=(struct Polynomial *)malloc(LEN);
			printf("请输入第%d项的系数,以及第%d项的未知数的指数:",n+1,n+1);
			scanf("%d %d",&p1->coef,&p1->expn);
		}
		p2->next=NULL;
		printf("该多项式创建完毕!\n");
		n=0;
		return(head);
	}
	else 
	{
		printf("项数输入错误!该多项式不存在!");
		exit(1);
	}	
}
struct Polynomial * AddPolyn(struct Polynomial *la,struct Polynomial *lb,struct Polynomial *lc)	//完成多项式的相加,指数相同的计算,不同的插入。按大小次序加
{
	//如果遇到指数相同的,就相加,如果走完都没有,就合并
	struct Polynomial *pa,*pb,*pc;
	pa=la;
	pb=lb;
	if (pa != NULL && pb != NULL && pa->expn <= pb->expn)
	{
        lc = pa;
        pc = pa;
        pa = pa -> next;
    }
	else if (pa != NULL && pb != NULL)
	{
        lc = pb;
        pc = pb;
        pb = pb -> next;
    }	
	while(pa && pb)
	{
		if(pa->expn <= pb->expn)
		{
			pc->next=pa;
			pc=pa;
			pa=pa->next;
		}
		else
		{
			pc->next = pb;
			pc=pb;
			pb=pb->next;
		}
	}
	pc -> next = pb == NULL ? pa : pb;
    pc = lc;
	printf("合并后如下:\n");
    return pc;
}
void Print(struct Polynomial *head)					//打印出多项式
{
 	printf("该多项式如下:");
	struct Polynomial *p;
	p=head;
	if(head!=NULL)
	{
		while(p!=NULL)
		{
			if(p->coef<0)
			{
				printf(" -%dx^%d",p->coef,p->expn);
			}
			else printf(" +%dx^%d",p->coef,p->expn);
 			p=p->next;
		}
	}
	else printf("链表为空!");
 
}
void Add(struct Polynomial * la,char way)
{
	int m = 1;
	int flag = 0;
	struct Polynomial *p,*p2;
	p=la;
	while(p->next!=NULL)
	{
		 
		p2=p->next;
		while(p2->expn == p->expn && !flag)
		{
			flag = 0;
			switch(way)
			{
			case '+':p->coef = p->coef + p2->coef;break;
			case '-':p->coef = p->coef - p2->coef;break;
			default:printf("请输入 + 或 - 号!");exit(1);break;
			}
		 
			if(p2->next)
			p2=p2->next;
			else flag =1;
//			Delete(la,m+1);			//这个位置为什么不行呢?在外面测试都可以			
		}
						//这个位置为什么不行呢? 
		p=p->next;
//		Delete(la,m+1);//可以
		m++;
	}
	printf("计算结果如下:\n");		 
}
void Delete(struct Polynomial * la )
{
	struct Polynomial *p,*q;
	p=la;
	if(la)
	{
		/*
 		do
		{
			q=p->next;	 
	 		do
			{
				if(p->expn == q->expn)
				{	
					p->next = q->next;
					free(q);
					q=p->next;
				}
			}while(q && q->next!=NULL);
			p=p->next;			 
		}while(p && p->next!=NULL);*/
		do
		{
			q=p->next;
			while(p->expn == q->expn && q)
			{
				p->next =q->next;
				free(q);
				q=p->next;
			}
			p=p->next;
		}while(p->next);
		printf("\nxx");				 
	}
	else exit(1);
 
}
那闯 2013-10-11
  • 打赏
  • 举报
回复
while(p->expn == q->expn && q) 如果 q为NULL,你的程序会Crash 改成这样好点while(q && p->expn == q->expn)
AnYidan 2013-10-11
  • 打赏
  • 举报
回复
自动停止 还是异常退出,跟踪看看

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧