线性表之链式存储结构

下面代码为单链表的一些基本操作:

#include <iostream>
using namespace std;

typedef int ElemType;

typedef struct Lnode
{
	ElemType data;
	struct Lnode *next;
}*LinkList;

//逆序建立链表
LinkList ReCreateLinkList(LinkList &L)
{
	int n = 0;
	cout<<"请输入要创建的元素的个数n:"<<endl;
	cin>>n;
	char str[100];
	sprintf(str,"请输入%d个元素\n",n);
	cout<<str<<endl;
	int elem;
	L = (LinkList)malloc(sizeof(Lnode));
	L->next = NULL;
	for(int i=0;i<n;i++)
	{
		cin>>elem;
		LinkList p = (LinkList)malloc(sizeof(Lnode));
		p->data = elem;
		p->next = L->next;
		L->next = p;
	}
	cout<<"L = "<<L<<endl;
	return L;
}

/*顺序实现链表
--思路一定要清晰
*/
LinkList CreateLinkList(LinkList &head)
{
	int n = 0;
	
	cout<<"请输入要创建的元素的个数n:"<<endl;
	cin>>n;
	char str[100];
	sprintf(str,"请输入%d个元素\n",n);
	cout<<str<<endl;
	int elem;
	head = (LinkList)malloc(sizeof(Lnode));
	head->next = NULL;

	LinkList L = head;
	
	for(int i=0;i<n;i++)
	{
		cin>>elem;
		LinkList p = (LinkList)malloc(sizeof(Lnode));
		p->data = elem;
		p->next = NULL;
		L->next = p;
		L = p;
	}

	return head;
}

//另一种实现方式,C++程序设计语言提示:这种方法是错误的,指针作为局部变量返回

//上面的注释是错误的,可以返回局部指针变量的值,值可以为地址。但是不可以返回局部变量的地址。刚刚理解这句话:-D
LinkList createLinkListAnthor(LinkList &L)
{
	//
	LinkList head;
	head = (LinkList)malloc(sizeof(Lnode));

	L = head;

	int n = 0;
	cout<<"请输入要创建的元素的个数n:"<<endl;
	cin>>n;
	char str[100];
	sprintf(str,"请输入%d个元素\n",n);
	cout<<str<<endl;
	int elem = 0;
	for(int i=0;i<n;i++)
	{
		cin>>elem;
		LinkList p = (LinkList)malloc(sizeof(Lnode));
		p->data = elem;
		p->next = NULL;
		L->next = p;
		L = p;
	}

	return head;
}



//查找倒数第K个结点的值

ElemType findValue(LinkList &L,int k)
{
	LinkList p = L;

	
	for(int i=0;i<k-1;i++)
	{
		p = p->next;
	}

	while(p->next != NULL)
	{
		p = p->next;
		L = L->next;
	}
	return L->data;
}

//求链表中的最大值
LinkList findMax(LinkList L)
{
	LinkList p = L->next;
	L = p;
	int max = p->data;
	while(L != NULL)
	{
		if(L->data > max)
		{
			max = L->data;
			p = L;
		}
		L = L->next;
	}

	return p;

}

//求链表中的最小值
LinkList findMin(LinkList L)
{
	LinkList p = L->next;
	L = p;
	int min = p->data;
	while(L != NULL)
	{
		if(L->data < min)
		{
			min = L->data;
			p = L;
		}
		L = L->next;
	}

	return p;

}

LinkList insertLinkList(LinkList &L,int i,int value)
{
	LinkList Head = L;
	int k = 0;
	while(k < i)
	{
		Head = Head->next;
		k++;
	}

	LinkList p = (LinkList)malloc(sizeof(Lnode));

	p->data = value;
	p->next = Head->next;
	Head->next = p;


	return L;

}

LinkList deleteLinkList(LinkList &L,LinkList p)
{

	while(L->next != p)
	{
		L = L->next;
	}
	
	if(L->next == p)
	{
		L->next = p->next;
		delete p;
	}

	return L;
}

LinkList deleteLinkList(LinkList &L,int location)
{
	
	LinkList Head = L;
	int k = 0;
	
	while(k < location)
	{
		Head = Head->next;
		k++;
	}
	
	/*
	LinkList p = Head->next;
	cout<<p->data<<" "<<p->next->data<<endl;
	Head->next = p->next;
	delete p;
	*/
	
	/*好好注意 内存问题*/
	cout<<Head->next->data<<" "<<Head->next->next->data<<endl;
	Head->next = Head->next->next;
	return L;
}
void print(LinkList L)
{

	while(L->next != NULL)
	{
		cout<<L->next->data<<"	";
		L = L->next;
	}
	cout<<endl;
}

void main()
{
/*
	LinkList L;
	LinkList L1 = ReCreateLinkList(L);
	print(L1);
	

	LinkList L2;
	LinkList L3 = CreateLinkList(L2);
	print(L3);

 */ 
	LinkList L4;
	L4 = createLinkListAnthor(L4);
	print(L4);
	
	insertLinkList(L4,4,100);
	print(L4);
	deleteLinkList(L4,2);
	print(L4);



}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值