废话不多说系列1:
最近浪浪才学完链表,相信好多人应该和我一样,面对链表的相关操作也是头疼的很。对于链表环环相扣的结构开始对新手来说确实是不太好理解,更不用说自己对链表进行其他的一系列操作了。但是如果你能够通过画图把链表的结构给弄懂了,那么其实你会发现操作链表就像是操作数组的元素样简单。
进入正题:
The First:链表的创建;
废话不多说系列2:链表的创建是基础,删除,查找,排序,拆分都得先有个链在这把(说好的废话不多说,那就酱叭!)
链表的创建主要有静态链表还有动态链表(其实还有双向链表,但是本浪还没有深入学习,所以需要你的关注,待后更新,5555)
一.静态链表
废话不多说系列3:静态链用的比较少,而且比较简单(不是来拉仇恨的2333),就是简单的接链,所以直接上干货。。。。
#include<iostream>
using namespace std;
typedef struct Student{
string name;
int score;
struct Student* next;
}Stu;
void print(Stu* head){
Stu* i=head;
while(i!=NULL){
cout<<i->name<<"\t"<<i->score<<endl;
i=i->next;
}
}
int main(){
Stu*head;
Stu stu[3];//这里我们只是为了演示接链的过程
//所以数据创建的比较简单
for(int i=0;i<3;++i){
cin>>stu[i].name >>stu[i].score;
}
//下面的过程就是机械地接链过程了
head=&stu[0];
stu[0].next =&stu[1];
stu[1].next =&stu[2];//把上面地声明换成指针,这里换成箭头来进行输入也是可以的
stu[2].next=NULL;
print(head);
return 0;
}
*
二.动态链表
废话不多说系列4:动态链表我们用的比较多,本浪认为主要是动态链表能够根据我们地需要进行自由地扩展,更加符合我们生活中的情况,但是这个链表地创建对于初学者来说可能是比较困难的,当时本浪在学习的时候也是花了好一番功夫呢。但是既然是废话不多说,所以在这里还是要总结一下自己的学习经验,好然更多的同学能很轻松的建立一个动态链表。那么学习经验就是:慢慢的都是套路
******套路总结如下:******指针要三个
一个头,一个探索指针,一个尾随指针
首个数据不空头指向它,首个数据为空head=NULL;
探索指针malloc一个读入一个,p2在判断p1不空的时候紧跟上;
最终别忘了指向NULL;
**说这么多,重要的就总结一句话:**需要三个指针…
下面的代码只是给出函数题,其他的枝枝叶叶就由读者自己补齐把
Stu* creat(){
Stu*head;
Stu*p1,*p2;
p1=(Stu*)malloc(LEN);
scanf("%s %d",p1->name,&p1->score);//这里不要使用cin,亲测会出现毛病
//曾经有位大佬知道小弟说cin输入流本身就有很多毛病,所以在涉及到
//字符串输入时笔者喜欢用scanf
int n=1;//这里的n是用来判断是不是第一次输入数据
//如果是第一次输入数据的话就让头指针指向它
while(p1->score!=0){
if(n==1){//看到没n的作用显现了
head=p1;
n++;//从此以后n再无用
}else{
p2->next=p1;
}
p2=p1;//p2跟进p1的步伐
p1=(Stu*)malloc(LEN);
scanf("%s %d",p1->name,&p1->score);//这里的重复申请主要是为了呼应while的循环判断
}
p2->next=NULL;
return head;
}