链表的常见操作入门(一)
链表的建立:
一般采用结构体指针,建立如下:
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);
}
(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; }
以上就是链表的基础操作学习,如有更进一步的链表学习,将在下一篇博文。