入门的C
大一学习了C语言课程之后,对编程还是有些兴趣的,用代码解决一些小问题很满足的,尤其是在调试成功没有报出奇奇怪怪的错误的时候。最兴奋的自然是通过了全部的测试样例,感觉整个人飘飘然嘻嘻!回首大一的C语言课程,真的是入门级的简单(除了函数、指针、结构体哈),有些是永恒的难点,不管在哪个领域。
数据结构
一门神奇的课在大二开展,老师把课生动地讲成三部曲:逻辑结构、存储结构、算法,节节如此,课课亦然。开始急于看到所谓的代码功效,不知天高地厚地给老师写了邮件说考虑现场编程,才得知这门课更重要的是思维,此刻突然想复习数据结构了,安排上!第一次上机漏洞百出,不过很感谢老师的讲解,下附心得感悟和部分代码嘻嘻!
- 顺序表逆置:
数据顺序存入数组中,我们逆向输出即可达到逆置效果;
void invert(sequenlist*L)
{
for (int i = L->last; i >= 1; i--)
{
printf("%2c", L->date[i]);
}
printf("\n");
}
- 单链表逆置
开始思考的时候不知从头断还是从尾断,从头断开之后想的是找不到下一个元素了,从未断开之后则找不到上一个元素了。后来也没有想出来,借鉴了同学的代码。
她使用了两个指针,一个依次指向单链表的每一个元素,另一个进行神奇的逆置操作,相当于把相邻元素断开,把后一个元素放到前一个元素前面达到逆置的目的。
这一题中对我来说是头结点的理解不够,链表第一个结点的位置存放在头结点的指针域中,开辟出头结点的位置后要将头结点的指针域先指向空,这两点明白之后才真正理解了头插法;
void invert(linklist *head)
{
linklist*p ,*q;
p=head->next;
head->next=NULL;
while (p != NULL)
{
q=p;
p=p->next;
q->next=head->next;
head->next=q;
}
}
- 分解单链表
分类标准不难,但是难的是明确指针到底指到了哪里。在学习的时候应该牢记指针指向的是一个地址,不可复制;
//添加按字母、数字、其它字符分解单链表算法
void resolve(linklist*head,linklist*letter,linklist*digit,linklist*other)
{
linklist*p=head->next;
linklist*pl=letter,*pd=digit,*po=other;
while(p!=NULL)
{
if((p->data)>='0'&&(p->data)<='9')
{
pd->next=p;
pd=pd->next;
}
else if(((p->data)>='a'&&(p->data)<='z')||((p->data)>='A'&&(p->data)<='Z'))
{
pl->next=p;
pl=pl->next;
insert_head(letter, p);
}
else
{
po->next=p;
po=po->next;
insert_head(other, p);
}
p=p->next;
pl->next=letter;
pd->next=digit;
po->next=other;
}
}
- 判断字符串是否中心对称
在循环的时候要像计算机一样笨笨地演练一遍,检查计数的变量初始值或者进入判断时的值有没有达到预期。
//添加判字符串是否中心对称算法
int symmetry(linklist*head,stack*s)
{
linklist*p=head->next;
int n=1;
int temp=1;//返回值,用1.0表示是否中心对称
while(p!=NULL)
{
if(length(head)%2==0)//字符串为偶数,入栈一半后出栈与后半部分比较
{
if(n>length(head)/2)
{
if(p->data!=pop(s))//一旦有一个不等,变量temp置于0
temp=0;
}
else
{
push(s,p->data);
}
n++;
}
else//字符串为奇数,入栈一半后跳过最中间的数出栈与后半部分比较
{
if(n>(length(head)/2)+1)
{
if(p->data!=pop(s))//一旦有一个不等,变量temp置于0
temp=0;
}
else if(n<(length(head)/2)+1)
{
push(s,p->data);
}
n++;
}
p=p->next;//指向下一个元素
}
return temp;
}
BTW,昨天听同学讲了2h的微信小程序前端开发,很敬佩。我知道,一些东西在向我慢慢靠近,而我也在主动的靠近着他们呢。编程路漫漫,请你踏实干!
愿晴空万里,没有暴风雨