链表的建立:
一般采用结构体指针,建立如下:
struct node
{
int data;
struct node *next;
}
链表的头文件:
#include<stdlib>
链表基本模板:
(1)链表建立:
struct node
{
int m;
struct node *next;
}*p,*q,*o;
(2)链表开辟:
///开辟初始位置的头结点
q = (struct node*)malloc(sizeof(struct node));
///循环寻找的结点
p = q;
for(int i=0; i<N; i++)
{
scanf("%d",&date);
///开辟的结点
o = (struct node*)malloc(sizeof(struct node));
p->next = o;
o->m = date;
p = o;
}
///结束结点的位置指向
p->next = NULL;
///开始输出
p = q->next;
(3)链表处理
p = q->next;
free(q);
while(p!=NULL)
{
///操作处理地方。
/*
.
.
.
*/
o = p;
p = p->next;
free(o);
}
free(p);
链表的基本操作:
(1)查找
如题:给定单链表头结点,删除链表中倒数第k个结点。
第一种方法:直接删除某个位置的元素。
for(int i=0; i<K; i++)
{
if(i==K-N)
{
s = p;
r->next = p->next;
p = p->next;
free(s);
}
else
{
r = p;
p = p->next;
}
}
第二种方法:在建立结构体是建一个变量,去记录第几个元素。从而判断是不是我们寻找的?
N = N -1;
b = 0;
while(p!=NULL)
{
if(p->n!=K-N)
{
if(b==0)
{
printf("%d",p->m);
b=1;
}
else printf(" %d",p->m);
}
o = p;
p = p->next;
free(o);
}
(2)去数
如题:已知一个线性表,要求删除线性表内大于等于min且小于等于man的数,并输出删除后的线性表
直接输出加一个要求就可以了。
while(p!=NULL)
{
if(!(p->m>=min && p->m<=max))
{
if(b==0)
{
printf("%d",p->m);
b=1;
}
else printf(" %d",p->m);
}
o = p;
p = p->next;
free(o);
}
while(p!=NULL)
{
if(!(p->m>=min && p->m<=max))
{
if(b==0)
{
printf("%d",p->m);
b=1;
}
else printf(" %d",p->m);
}
o = p;
p = p->next;
free(o);
}
(3)遍历
如题:现在有一个中奖号码,有一个兑奖号码,小T想知道一共有多少个数字位置正确的,N太大了……
数组一个也可以AC,但是最好去学习链表的方式,毕竟你要学习链表。
代码如下:
int Answer(struct node *ch,struct node *sh)
{
int ans =0;
while(ch!=NULL)
{
if(ch->n == sh->n)
ans++;
o = ch;
ch = ch->next;
free(o);
o = sh;
sh = sh->next;
free(o);
}
return ans;
}
以上就是链表的基础操作学习,如有更进一步的链表学习,将在下一篇博文。