如果定义一个数组并且不进行初始化,那么在调试时数组里的值都是'?',在初始化时,若初始化的值的个数小于数组的长度,那么在调试时剩余未被赋值的数组的值就是'/0',这里为什么会这样,是因为系统为了防止后续对数组的操作或判断出现错误而将剩余的数组都赋值空字符吗?就比如要打印数组中的每个值,防止打印多余的值,所以这样做。还是有其他的原因
在大多数编程语言中,未初始化的数组中的值是不确定的,可以是任何值。在调试时,未初始化的数组元素通常显示为一些随机的值或垃圾值。
当你对数组进行初始化但没有给所有元素赋值时,剩余未被赋值的数组元素的值将被设置为默认值。在C++中,这个默认值为0。在其他编程语言中,默认值可能会有所不同,例如Java中默认为null或者false。
这种行为的原因是:许多编译器和运行时环境会在内存中分配一块连续的空间来存储数组,并且在内存中初始值为0。因此,如果您只初始化了部分数组元素,则未初始化的元素将保留内存中的默认0值。
C语言这个不一定。调试的时候会初始化内存为0xcc或者0xcd,直接运行是随机值。
楼上说的不敢苟同,VB Java PHP Js C# Python都不属于没有初始化数组是随机值这种,不能说“大多数语言”吧
前言
对于一元多项式,我们完全可以利用线性表P(a0,a1,a2,…,an)表示,这样的线性表在求两个多项式相加等操作时确实简单,但是多于如下的多项式:
利用上述线性表将存储为S(1,0,0,0,0,…,3,…,2);这样的结构显然对内存造成浪费
为了解决以上问题,可以将上面的线性表改善为P((a1,e1),(a2,e2),…,(am,em))只存储系数不为0的项,下面是该线性表的链式存储结构的代码实现。
#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h"
#define LEN sizeof(node);
typedef struct polynode
{
int coef;//系数
int exp;//指数
struct polynode *next;
}node,*ListPolynode;
/*倒序创建一元多项式*/
void createPoly(ListPolynode L,int n)
{
ListPolynode p;
for (int i=n;i>0;i--)
{
p=(ListPolynode)malloc(sizeof(node));
printf("请输入第%d项系数\n",i);
scanf_s("%d",&p->coef);
printf("请输入第%d项指数\n",i);
scanf_s("%d",&p->exp);
p->next=L->next;
L->next=p;
}
}
/*正序创建一元多项式*/
ListPolynode createPoly1(ListPolynode L,int n)
{
ListPolynode p;
ListPolynode head=L;
for (int i=0;i<n;i++)
{
p=(ListPolynode)malloc(sizeof(node));
printf("请输入第%d项系数\n",i+1);
scanf_s("%d",&p->coef);
printf("请输入第%d项指数\n",i+1);
scanf_s("%d",&p->exp);
L->next=p;
p->next=NULL;
L=L->next;
}
return head;
}
/*打印一元多项式*/
void printfPoly(ListPolynode L)
{
ListPolynode p=L->next;
while(p)
{
printf("%d*x^%d ",p->coef,p->exp);
p=p->next;
}
printf("\n");
}
/*多项式相加*/
void addPoly(ListPolynode La,ListPolynode Lb)
{
ListPolynode currenLa=La->next;//指向La的当前结点
ListPolynode currenLb=Lb->next;//指向Lb的当前结点
ListPolynode temp;//待释放空间的临时结点
ListPolynode pre=La;/*位置指针,指向和多项式La,利用pre修改La*/
int sum;//相同指数结点系数之和
while (currenLa!=NULL&¤Lb!=NULL)
{
if (currenLa->exp<currenLb->exp)//La的当前结点指小于于Lb的当前结点指数
{
//Lb的当前位置不变,La当前位置后移
pre->next=currenLa;
pre=pre->next;
currenLa=currenLa->next;
}
else if (currenLa->exp==currenLb->exp)//La的当前结点指数等于Lb的当前结点指数
{
sum=currenLa->coef+currenLb->coef;
if (sum!=0)
{
//将La当前结点的系数改为sum,并链接到pre;将La的当前结点后移,之后过河拆桥将La的当前结点释放
currenLa->coef=sum;
pre->next=currenLa;
pre=pre->next;
currenLa=currenLa->next;
temp=currenLb;
currenLb=currenLb->next;
free(temp);
}
else
{
temp=currenLa->next;
free(currenLa);//过河拆桥干掉La当前结点
currenLa=temp;
temp=currenLb->next;
free(currenLb);//策略雷同,过河拆桥
currenLb=temp;
}
}
else//La的当前结点指数大于Lb的当前结点指数
{
//Lb当前位置添加到La当前位置之前,同时Lb向后移动一位,La向后移动一位
pre->next=currenLb;
pre=pre->next;
currenLb=currenLb->next;
}
}
if (currenLa!=NULL)//La未结束,将其全部链接到pre
{
pre->next=currenLa;
}
else//若Lb未结束,将其全部链接到pre
{
pre->next=currenLb;
}
}
int _tmain(int argc, _TCHAR* argv[])
{
ListPolynode La=(ListPolynode)malloc(sizeof(node));
La->next=NULL;
printf("请输入创建一元多项式的项数\n");
int n;
scanf_s("%d",&n);
createPoly1(La,n);
printfPoly(La);
ListPolynode Lb=(ListPolynode)malloc(sizeof(node));
Lb->next=NULL;
printf("请输入创建一元多项式的项数\n");
scanf_s("%d",&n);
createPoly(Lb,n);
printfPoly(Lb);
addPoly(La,Lb);
printfPoly(La);
system("pause");
return 0;
}