1.链表的组成:由一系列结点组成。结点(包括数据域和指针域)
例如:将一个结点设置为一个结构体
typedef struct student
{
char name;
int score;
struct student * next;
}node;
2.链表分为两种:1)带头结点的链表; 2)不带头结点的链表;
(通常为带头结点的链表)所以链表的第一个结点只有指针域储存第二个结点的位置,数据域没有数据。由于第一个结点的位置没有其余的结点中的指针去储存,所以需要头指针去储存头结点的位置,即声明一个头指针 node *head;
当还没有建立第一个结点时,则head=NULL;
3.链表的插入:单链表的插入代码实现
例如:在单链表l中p所指向的结点之后插入值为a的结点
void input(linklist head,int a,node *p)
{
node * pnew;
pnew=(node*)malloc(sizeof(node));
pnew->score=a;
pnew->next=p->next;
p->next=pnew;
}
4.链表的删除:既然想删除一个结点,就要找到删除的这个结点的前驱位置。找到前驱位置后通过两条赋值语句,和删除语句。再释放被删除的结点所占的空间即可。所以删除的主要是找到前驱位置。
找到结点的前驱位置的方法是遍历。
单链表的删除代码实现:
void delete1(linklist head,node *p)
{
node *pre;
pre=head->next;
while(pre->next!=p)
pre=pre->next;
pre->next=p->next;
free§;
}
5.链表的遍历:当我们需要知道一个数是否在这个链表里或者这个链表有多少个结点,我们需要通过链表的遍历可知。同时需要声明一个记录结点的个数的变量,sum;
void bianli(linklist head,int a)
{
sum=0;
node *p;
p=head;
while(p->next!=NULL)
{
sum++;
printf("%d\n",p->score);
p=p->next;
}
printf("sum=%d\n",sum);
}
链表的结点的建立:1.头插法 2.尾插法
头插法:又称反向建立。头插就是把新的节点插在原来的节点和原来节点的下一个节点之间的一个节点。
步骤:1.访问头结点 2.将新的结点的下一个结点设置为原来头结点的下一个结点。3.将头结点的下一个结点设置为新的结点
头插法的代码实现
linklist create_head()
{
linklist head;
node *pnew;
int x;
head=(linklist)malloc(sizeof(node));
head->next=NULL;
scanf("%d",&x);
while(x!=0)
{
pnew=(node *)malloc(sizeof(node));
pnew->data=x;
pnew->next=head->next;
head->next=pnew;
scanf("%d",&x);
}
return head;
}
尾插法:又称正向建立。尾插法就是把新的结点插入到原来的最后一个结点上。
步骤:1.访问头结点 2.判断是否为最后一个结点,如果不是,向后移动,如果是,将新的结点插入到原来的最后一个结点的后面
尾插法的代码实现:
linklist create_tail
{
linklist head;
node *pnew,*r;
int x;
head=(linklist)malloc(sizeof(node));
head->next=NULL;
r=NULL;
scanf("%d",&x);
while(x!=0)
{
pnew=(node*)malloc(sizeof(node));
pnew->data=x;
pnew->net=r->next;
r=pnew;
scanf("%d",&x);
}
r->next=NULL;
return head;
}