1.创建
struct node(){
int num,data;
node next; //也可以记录父节点
};
如上图,创建了一个叫node的链表。其中分为数据域和指针域,数据域放数据,指针域放下一项(当然也不唯一,也可以同时放上一项)。
2.引入
head=new node;
引入一个node放在head里面。new xxx:创建一个新的xxx型后该结构体的地址(如new node代表创建新的node后这个node的地址)。
3.使用
//图1
struct node(){
int num,data;
node next;
}*head,*p,*r;
//node *head,*p,*r;
如图1,创建变量,可以在结构体后面直接创建,也可以单独拎出来创建。(链表用指针型)
//图2
r=p->next;
a=p->num;
r->data=p->num;
使用指针所指示的结构体的变量用"->"这个符号。如图2,p->num代表p那项的num变量,p->next代表p那项的next指针。
4.实战
这段只是个实例,用法可以更灵活,不唯一。
#include<iostream> //strin and stdout 的头文件
#include<cstdlib> //free() 的头文件
using namespace std;
struct node{ //创建叫node的链表
int num; //放数据的(数据域)
node *next; //下一个项的地址(指针域)
};
node *head,*p,*r; //head 头项目的地址(一般不放东西) p,r 待会儿有用
void init(int); //创建(详细均见下)
void in(int,int);//插入
void rep(int,int);//替换
int out(int);//输出
void del(int);//删除
int len();//长度
int main()
{
init(10); //创建有10个项的链表
in(3,4); //在第三项后插入一项,值为4
rep(3,5); //将第三项的值替换为5
cout<<out(5); //输出第五项
del(5); //删除第五项
cout<<len(); //输出列表长度
return 0;
}
void init(int x){ //创建有x个项的链表
int a;
//new xxx:创建一个新的xxx型后该结构体的地址(如new node代表创建新的node后这个node的地址)
head=new node; //head为一个新的项
r=head; //r指针也指向head的项
for(int i=0;i<x;i++){
cin>>a; //输入
p=new node; //创建新的一项
//p->q p所指的项的q变量(如p->num代表p所指的这一项的num变量)
p->num=a; //p的这一项的num赋值为a
p->next=NULL; //p的指针不指向任何东西(好习惯)
r->next=p; //r为p的前一项,叫它的下一项指向p
r=p; //r后移
}
return;
}
void in(int x,int y){//在第x项后插入一项,值为y
r=head; //r先为head
//r=r->next r后移(r指向r的下一项)
for(int i=0;i<x;i++)
r=r->next; //r指向第x项
p=new node; //创建一个项
p->num=y; //它的值等于y
p->next=r->next;//p的下一项等于r的下一项
r->next=p; //r下一项指向p
return;
}
void rep(int x,int y){//将第x项的值替换为y
p=head; //p等于head
for(int i=0;i<x;i++)
p=p->next; //p指向第x项
p->num=y; //替换
return;
}
int out(int x){ //返回第x项(自己理解理解)
r=head;
for(int i=0;i<x;i++)
r=r->next;
return r->num;
}
void del(int x){ //删除第x项
r=head;
for(int i=0;i<x-1;i++)
r=r->next; //要删除的前一项
p=r->next; //p等于要删除的一项
r->next=p->next;
//要删除的前一项将下一项指向要删除的项的下一项
//(就是跳过了要删除的一项;p的前一项r指向p的下一项)
//free函数 删除地址。如free(&a),删除变量a(如果*p=a(p=&a),那么free(p)效果一样)
free(p); //删除第x项
return;
}
int len(){ //列表长度
int l=0;p=head;
while(p->next!=NULL){//p指向NULL代表它是最后一项(看init())
p=p->next;
l++;
}
return l;
}