链表

静态链表

const int NULL=0;
#include <iostream>
using namespace std;
class book
{
public:
	int num;
	float price;
	book*next;
};
void main()
{
	book x,y,z,*head,*p;
	x.num=5;
	x.price=22.5f;
	y.num=6;
	y.price=33.6f;
	z.num=7;
	z.price=44.7f;
	head=&x;
	x.next=&y;
	y.next=&z;
	z.next=NULL;
	p=head;
	while(p!=NULL)
	{
		cout<<p->num<<endl<<p->price<<endl;
		p=p->next;
	}
	system("pause");
}


动态链表

const int NULL=0;
#include <iostream>
using namespace std;
class book
{
public:
	int num;
	float price;
	book*next;
};
book *head=NULL;
book *creat()
{
	//p1作为下一个节点的指针,p2作为下个节点的指针
	book *p1,*p2;
	p1=new book;
	head=p1;
	p2=p1;
	cout<<"请输入图书的编号,以0结束"<<endl;
	cin>>p1->num;
	if(p1->num!=0)
	{
		cout<<"请输入图书价格"<<endl;
		cin>>p1->price;
	}
	else
	{
		delete p1;p2=NULL;head=NULL;return head;
	}
	while(p1->num!=0)
	{
		p2=p1;                                   //p2保存的是当p1的指针,
		p1=new book;                             //p1保存的是新开辟的空间
		cout<<"请输入图书的编号,以0结束"<<endl;
	         cin>>p1->num;
	         if(p1->num!=0)
		{
		    cout<<"请输入图书价格"<<endl;
		    cin>>p1->price;
		}
		p2->next=p1;                 //由于p保存的是p1的原来的指针,就等于旧的p1->next保存新的p1。
	}
	delete p1;           //最好一个保存的是0,所以删除掉
	p2->next=NULL;       //最新的p1也就是链中最后变的p1的next成员指针保存的值为空
	return head;                        //由于head指针和p2都是保存的p1最开始的指针,所以p2的作用是不断的给旧的p1保存新的p1,head的作用是利用最旧的p1查找p1保存的链式数据。
}
void main()
{
	creat();
}

 

 

插入图书的几种插法

 

尾插法

void insert(book*head,int num,int price)
{
	book*list=new book;       //创建一个新节点由list指针指向新节点
	book*l;                   //用来保存访问过的节点的地址
	while(head)               //判断是否存在头节点
	{
		i=head;
		head=head->next;      //最后l保存的是最好一个节点
	}
	l->next=list;             //list节点成为了最后一个节点然后把编号和价格赋给list指针
	list->num=num;
	list->price=price;
	list->next=NULL
}


 

前插法

void insert(book*head,int num,int price)
{
	book*list=new book;
	list->num=num;
	list->price=price;
	list->next=head;            //list成了头节点
	::head=list;                //把list赋给全局头节点
}


中间插法

 

void insert(book*head,int num,int price)
{
	book*list=new book;
	list->num=num;
	list->price=price;
	if (num<=head->num) //判断新插入的节点的编号是否小于等于头节点的编号
	{
	    list->next=head;   //小于则插在头节点前面
	    ::head=list;
		return;          //新节点成为了头节点要退出insert函数
	}
	book*temp=NULL;
	while((num>head->num)&&(head->next!=NULL))
	{
		temp=head;
		head=head->next;     //head指向最后一个节点
	}
	if (num>head->num)       //判断新节点编号是否大于head的尾节点编号
	{
		head->next=list;list.next=NULL;     //符合条件实行尾插
	}
	else
	{
		temp->next=list;     //temp保存了前一个节点的地址,head保存的下一个节点的地址
		//前一个节点就接上了list,然后list保存head节点,这样list就在中间插入了
		list->next=head;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值