这一周的主要学习目标是链表。链表这个名词很形象地体现出了它的运作方式,它将一个个的节点(元素)串联起来,看起来就和一条铁链一样。每个节点都有自己的位置和数据,因此,链表的节点一般由数据域和指针域组成。我比较喜欢尾插法这种连接方式(因为觉得稍微容易理解),它的大概意思就是在链表的尾端加上新的节点(元素)。下面来看实现的方式
首先来个结构体
typedef struct Node{
int data;//数据域
struct Node*next;//指针域
}node;
接着,咱还要一个链表的开头和几个要用的变量(后面再说)
node*head,*r,*p;//因为前面用了typedef,所以我们可以用node来代替struct Node
接下来,我们就要用一个void函数来进行操作了
void creat(){
head = (node*)malloc(sizeof(node));//用malloc函数申请一个node*类型node内存大小的空间
head->next = NULL;一定要记得初始化指针变量,不然你都不知道它会指向哪里
p = head;//由于head是头,没有头整个链表都会出大事,所以头不能动,此时,p就可以代替head遍历整个链表,你可以把p看成和传教士差不多的东西
for(int i=0;i<n;i++){
r = (node*)malloc(sizeof(node));//r是一个新的结点(元素),老样子,先申请空间
r->next = NULL;//初始化
scanf("%d",%r->data);//r的数据域
p->next = r;前一个结点的指针域设为当前新建结点的地址
p = p->next;//把p设为p->next,作为下个结点的前一个节点
}
}
至此,咱们的链表就创建完毕了,接下来是使用
int main()
{
scanf("%d",&n);
creat();
p = head->next;//老规矩,头不能动,传教士来代替
while(p!=NULL) {
r = p;
p = p->next;
free(r);//释放掉r(咱是有诚信的人,申请借来的东西要还回去)
}
free(head);//头也要还啊
return 0;
}
可能中间会有一些小瑕疵,但是总体的思路是这样没错,对于链表,我的掌握还远远不够。可能会有细心的人已经发现链表和数组有点相似,咱下周还来,顺便说说链表与数组的相似之处以及各自的优缺点。