今天算是对链表和指针有了一个新的感悟。以前总是朦胧的概念,特别对于malloc()函数,几乎是死记硬背,现在认识的清晰了一点。
感触如下:
- 对于链表的使用正如数组的使用要有常用的遍历符号:t,数组中的遍历符号都是i,j;数组的遍历结束标志为数组长度,链表的遍历结束为t==NULL如果还是有点蒙,请看如下代码:
数组:
//数组
for(int i=0;i<n;i++){
......
}
链表:
//链表
t=head;//前提是已经定义好t head都是指针类型的,如果不懂可以看完整的题解代码
//t=head就相当于数组中的i=0,赋初值。
while(t!=NULL)//循环条件{
... ...
}
- 对于链表来说,还有一些经常出现的定义符号*q,*p,*head
符号 | 含义 |
---|---|
*q | 表示上一个节点,如数组中i-1 |
*head | 表示头结点 |
*p | 临时存放 |
其中*p是几乎必不可少的,正如数组中的临时变量temp(随个人习惯不同,只需要知道是临时变量就行) ;至少在计算机二级中,是链表就会看见这几个变量
关于啊哈算法链表手打题解(半懵半懂)
#include<iostream>
#include<stdlib.h>
using namespace std;
struct node{
int data;
struct node *next;
};
int main(){
int n,a;
cin>>n;
struct node *head,*p,*q,*t;
head=NULL;//头指针初始为空
for(int i=0;i<n;i++){//循环读入n个数 表示原始数列
cin>>a;
//动态申请一个空间,用来存放一个结点,并用临时指针p指向这个节点
p=(struct node *)malloc(sizeof(struct node));
p->data=a;
p->next=NULL;
if(head==NULL){
head=p;//这是一个创建的节点
}else{
q->next=p;
//如果不是第一个创建的节点,上一个节点的后继指针,指向当前结点
}
q=p;//q表示当前节点 p表示临时存放 head头结点
}
cin>>a;//读入带插入的数
t=head;// t为遍历变量,就像i j 一样用作遍历下标
while(t!=NULL){//没有到达链表尾部的时候循环
if(t->next==NULL || t->next->data > a){
//注意特殊情况,到达链表尾部
p=(struct node *)malloc(sizeof(struct node));
p->data=a;
p->next=t->next;
t->next=p;
break;//插入完毕,退出循环
}
t=t->next;//继续判断下一个结点
}
t=head;//继续遍历链表,输出数据
while(t!=NULL){//遍历终止的条件
cout<<t->data<<' ';
t=t->next;
}
return 0;
}