多项式加法启示
- 首先,链表是由单独的结点通过他们的指针域链接组成的表
- 因此结点是个体,并且每个结点包含的内容格式相同
- 所以定义结点的数据结构,就是弄清所要表示的数包含的内容
数据结构
结点存储多项式其中的数据项应该是包括系数和指数,所以对应的数据结构定义应该是(两个数据域以及一个指针域)
typedfy struct Node
{ int coef;//系数
int exp;//指数
struct Node *next;
}Node,*link;
- 一个多项式可以表示成由这些结点链接起来的单链表
多项式的初始化
分为两种,设头结点和不设头结点,以设头结点为例。注,因为设头结点,所以头指针指向头结点,而初始化时头结点指向为空。
void InitPolu(link* phead){
assert(phead);//断言头指针不是空指针
*phead=(Node*)malloc(sizeof(Node)) ;//为头结点分配空间
//注意,分配空间不一定成功,所以需要判断
if(NULL==*phead){
perror("initialization failed!");
exit(-1);
}
(*phead)->next=NULL;//将头结点的指针域置为空,此时还没有申请空间,后面还没结点呢
}
该代码说明几点
- 在主函数中会传入头指针,所以断言时头指针有指向,因此不会出错退出
- malloc函数分配空闲的代码空间返回的是指向该空间中第一个单元的地址,赋值给指针
- if条件判断中为了避免将判断是否相等误打为赋值运算符,将固定的不可赋值的数作为左值,这样如果误打为赋值编译器会报错,因为只可以赋值给变量。
- printf用perror代替,perror()函数在头文件stdio.h中被定义。作用是会将引号中的字符串输出并在编译器下告知更详细的错误原因。
- 最后一行代码,因为->运算符的优先级比*高,所以必须加括号。