结束了上午的高数竞赛,本打算这个周好好突击复习的。奈何离京一次实在太累……
题目总体难度不大,但是奈何自己小错不断,自送前程……
https://mp.weixin.qq.com/s/A7aQM-KhpaUuGHkldZsjaw
这个链接里有着这次的试题+答案……
情理之中
全力以赴12月份CET考试
链表,逆序,返回和
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
struct ListNode *link,*temp,*current;
link = (struct ListNode*)malloc(sizeof(struct ListNode));
temp = (struct ListNode*)malloc(sizeof(struct ListNode));
link->next=NULL;
link=temp;
int carry=0; //进位数值
int sum=0; //当前位的和
//当l1,l2,或最后一轮计算完需进位数不为0
while(l1!=NULL||l2!=NULL||carry>0){
int l1_val=l1==NULL?0:l1->val; //l1当前位值,不存在用0补上
int l2_val=l2==NULL?0:l2->val; //l2当前位值,不存在用0补上
sum=l1_val+l2_val+carry; //当前位两数之和+上一位求和进位数
carry=sum/10; //当前位求和需进位数
sum=sum%10; //当前位之和
//创建新链表
current=(struct ListNode*)malloc(sizeof(struct ListNode));
current->val=sum;
temp->next=current;
temp=current;
//l1,l2指向下一节点,不存在则设为NULL
l1=l1!=NULL?l1->next:NULL;
l2=l2!=NULL?l2->next:NULL;
}
temp->next=NULL;//最后一项next设为NULL
return link->next;//返回结果链表
}
这个解法link指针泄露了。OMG!
http://www.cnblogs.com/archimedes/p/c-point-memory-leak.html
这篇文章有所解释。
int l1_val=l1==NULL?0:l1->val; //l1当前位值,不存在用0补上
这句代码蛮是简洁。
逐位相加,模拟进位
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
int x, y, num, flag=0;
struct ListNode *p = l1, *q = l2;
struct ListNode *cur = (struct ListNode*)malloc(sizeof(struct ListNode));
cur->next = NULL;
struct ListNode *ret = cur;
while(p!=NULL || q!=NULL)
{
x = (p!=NULL)?p->val:0;
y = (q!=NULL)?q->val:0;
num = x+y+flag; //flag是进位
flag = num/10;
cur->next = (struct ListNode*)malloc(sizeof(struct ListNode));
cur = cur->next;
cur->val = num%10;
cur->next = NULL;
if(p!=NULL)
p = p->next;
if(q!=NULL)
q = q->next;
}
if(flag > 0)
{
cur->next = (struct ListNode*)malloc(sizeof(struct ListNode));
cur = cur->next;
cur->val = 1;
cur->next = NULL;
}
return ret->next;
}
递归
int c=0;
struct ListNode* addTwoNumbers(struct ListNode* l1, struct ListNode* l2){
if(l1==NULL && l2==NULL && c==0)return NULL;
l1 = l1!=NULL ? (c += l1->val, l1->next) : l1;
l2 = l2!=NULL ? (c += l2->val, l2->next) : l2;
struct ListNode *cur = (struct ListNode *)malloc(sizeof(struct ListNode));
cur->val = c%10;
c /= 10;
cur->next = addTwoNumbers(l1,l2);
return cur;
}
三目运算符
1.运算方向从左往右,从右往左结合,只有一个表达式被计算;
2.表达式 (n>0)?f:n的类型是float,与n是否为正值无关。
结构
-
为结构建立一个格式或样式;
结构声明——模板,勾勒出结构如何存储数据。
关键字struct,表明紧跟在其后的是一个结构,后面是一个可选的标记(可选)。
{}——括起来的是结构成员列表。
struct m n; (声明)创建结构变量n,该变量的结构布局是m。 -
定义结构变量——内存分配;
-
初始化结构
-
访问结构成员
结构成员运算符——(.)点