C++ 链表

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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值