链表是一个十分基础的数据结构,那么链表最开始的操作就是创建链表,链表的创建就分为两种类型,下面先介绍第一种:(尾插法)
(1)先将节点和一些要使用的符号或者特定的字母表示出来,并且将他们全部转化为(.h)文件后直接引用与后面要编写的链表功能相结合即可
#include<stdio.h>
#include<stdlib.h>
#include<Windows.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;
typedef ElemType *Triplet;
typedef struct Node{
ElemType data;
struct Node *next;
}Lnode,*Linklist;
接下来就是创建链表了:
int n;
int s;
Linklist head = NULL;
Linklist p = NULL;
Linklist end = NULL;
head = (Linklist)malloc(sizeof(Lnode));
head->next = NULL;
end = head;
printf("请输入要创建的链表大小:");
scanf("%d",&n);
while(n--){
printf("请输入数据:");
scanf("%d",&s);
p = (Linklist)malloc(sizeof(Lnode));
p->data = s;
end->next = p;
end = p;
}
end->next = NULL;
以上就是创建部分,对于其中理解如下:
(尾插法)链表的创建我们可以分为几个步骤:
(1)先创建一个头节点head,一个尾节点end,然后定义一个中间节点p.并且将他们全部赋值NULL
(2)然后将头节点的的下一个指向指向NULL,因为此时的头尾相同那么就可以将end和head赋值为相同
(3)然后理解重要一步p->data = s; end->next = p; end = p;
这一行是先将我们要输出的值存入链表中;第3行是我将尾节点向后移一位,就是将我要插入的中间节点给尾节点所指向的下一个节点,这样就是起到了将尾节点向后移一位的作用;然后第二行我将其中的的p节点和这个end节点串联起来了,end的指向定了,定为了p的位置。
(4)最后我们将最后的end的指向要指向NULL,此时的链表(尾插法)创建完成了。
下面我们来介绍一下头插法的创建节点的方法
其余创建节点和一些特定字母表示同上面的尾插法一样,这里就不多写了。
下面是(头插法)创建:
int n;
Linklist p;
p = (Linklist)malloc(sizeof(Lnode));
p->next = NULL;
printf("请输入你要创建的链表长度:");
scanf("%d",&n);
while(n--){
Linklist q;
int s;
q = (Linklist)malloc(sizeof(Lnode));
if(q==NULL){
printf("创建失败");
exit(0);
}
printf("请输入数据:");
scanf("%d",&s);
q->data = s;
q->next = p->next;/*(3)因为p->next已经是指向的空了,那么我们对于下一个的
指向一定是空,即最后一个的指向为空*/
p->next = q;
}
Linklist m = p;
while(m->next!=NULL){
m = m->next;
printf("%d %p\n",m->data,m->next);//这一部分用作打印链表数据是否存入成功
}
对于头插法的理解如下:
头插法的主要的思想是我们定义了一个head头节点之后,最先输入的一个节点是最后一个节点(因为我们在头插法中是每一个插入的节点都将插入头节点和上一个插入的节点之间,那么我们最开始插入的一个节点就是尾节点,最后一个插入的节点就是最前的一个节点),当我们理解了这个之后,就可以开始来理解代码了,代码最关键部分就是
q->data = s; q->next = p->next; p->next = q;
这个从上面的理解中不难得出这一段的操作是先将输入的数据存入q中去,然后将新创建的这一个节点所指向的下一个地址赋予了头节点的所指向的地址,即是上一个的节点存储的地方,然后再将q的节点地址给头节点p.此时就完成了创建
在这里强调一下理解,最开始学习创建链表的时候并不是难在链表后续或者的理解,而是头节点和第一个节点的创建和联系,不知道从何下手,下面就是一些最头部的链表链接的个人理解:/*
关于第一个节点指向的问题:
(1:头指针的下一个节点(即第一个节点)指向是不需要指向空的,利用头插法创建链表的时候,直接创建一个头指针指
向空(NULL)然后对于下一个新的节点先指向空,然后直接头插法创建,这样最后一个节点的
指针域一定是指向空的(可见注释(3));
*/
然后第一个的节点和第二个的节点根据上述步骤(关键那几步理解)可以直接链接起来就行。
第一次写博客,写给自己康康,学习之路很长,也许还有写错误,慢慢改进。