数据结构>>>链表的实现>>单链表

单链表:

  • 结构描述
  • 初始化
  • 遍历
  • 插入/删除
  • 查找
  • 排序(冒泡)

下面是具体的实现:

1.结构描述:

typedef struct Node
{
	int data;//数据域
	struct Node *pNext;//指针域
}NODE,*PNODE;

2.初始化:

PNODE creat_list()
{
	int len;//有效节点的个数。
	int i;
	int val;//临时存放用户输入节点的值。

	PNODE pHead=(PNODE)malloc(sizeof(NODE));
	if(pHead==NULL)
	{
		cout<<"分配失败,程序终止!"<<endl;
		exit(-1);//exit(1);
	}
	PNODE pTail=pHead;
	pTail->pNext =NULL;
	cout<<"请输入您需要生成的链表节点的个数:len=";
	cin>>len;
	for(i=0;i<len;i++)
	{
		cout<<"请输入第"<<i+1<<"个节点的值:";
		cin>>val;

	PNODE pNew=(PNODE)malloc(sizeof(NODE));
	if(pNew==NULL)
	{
		cout<<"分配失败,程序终止!"<<endl;
		exit(-1);//exit(1);
	}
	pNew->data=val;
	pTail->pNext =pNew;
	pNew->pNext =NULL;
	pTail=pNew;
	}
	return pHead;
}

3.遍历:

void traverse_list(PNODE pHead)
{
	PNODE p=pHead->pNext;
	while(p!=NULL)
	{
		cout<<p->data<<'\t';
		p=p->pNext ;
	}
	cout<<endl;
	return ;
}

4.插入/删除:

bool insert_list(PNODE pHead,int pos,int val)
{
	int i=0;
	cout<<"请输入需要插入元素的位置和值"<<endl;
	cin>>pos>>val;
	PNODE p=pHead;
	while(p!=NULL&&i<pos-1)
	{
		p=p->pNext ;
		++i;
	}
	if(i>pos-1||p==NULL)
		return false;
	PNODE pNew=(PNODE)malloc(sizeof(NODE));
	if(pNew==NULL)
	{
		cout<<"动态分配内存失败!"<<endl;
		exit(-1);
	}
	pNew->data =val;
	PNODE q=p->pNext ;
	p->pNext =pNew;
	pNew->pNext =q;
	return true;
}

bool delete_list(PNODE pHead,int pos,int *pval)
{
	int i=0;
	PNODE p=pHead;
	cout<<"请输入需要删除的元素的位置"<<endl;
	cin>>pos;
	while(p!=NULL&&i<pos-1)
	{
		p=p->pNext ;
		++i;
	}
	if(i>pos-1||p==NULL)
		return false;
	PNODE q=p->pNext ;
	*pval=q->data ;
	p->pNext =p->pNext->pNext ;
	free(q);
	q=NULL;
	return true;
}
  1. 查找:
int locate_list(PNODE p,int x)
{
	int i=1;
	p=p->pNext;
	while(p!=NULL&&p->data!=x)
	{
		p=p->pNext ;
		i++;
	}
	if(p==NULL)
		return 0;
	return i;
}

6.排序(冒泡):

void sort_list(PNODE pHead)
{
	int i,j,t;
	int len=length_list(pHead);
	PNODE p,q;
	for(i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext)
	{
		for(j=i+1,q=p->pNext;j<len;++j,q=q->pNext)
		{
			if(p->data>q->data)//类似于数组中的:a[i]>a[j]
			{
				t=p->data;//类似于数组中的:	t=a[i];
				p->data=q->data;//类似于数组中的:	a[i]=a[j];
				q->data=t;//类似于数组中的:	a[j]=t;
			}
		}
	}

}

------》源代码:

#include<iostream>
#include<malloc.h>
#include<stdlib.h>
using namespace std;

//1.结构描述:
typedef struct Node
{
	int data;//数据域
	struct Node *pNext;//指针域
}NODE,*PNODE;

//2.初始化:
PNODE creat_list()
{
	int len;//有效节点的个数。
	int i;
	int val;//临时存放用户输入节点的值。

	PNODE pHead=(PNODE)malloc(sizeof(NODE));
	if(pHead==NULL)
	{
		cout<<"分配失败,程序终止!"<<endl;
		exit(-1);//exit(1);
	}
	PNODE pTail=pHead;
	pTail->pNext =NULL;
	cout<<"请输入您需要生成的链表节点的个数:len=";
	cin>>len;
	for(i=0;i<len;i++)
	{
		cout<<"请输入第"<<i+1<<"个节点的值:";
		cin>>val;

	PNODE pNew=(PNODE)malloc(sizeof(NODE));
	if(pNew==NULL)
	{
		cout<<"分配失败,程序终止!"<<endl;
		exit(-1);//exit(1);
	}
	pNew->data=val;
	pTail->pNext =pNew;
	pNew->pNext =NULL;
	pTail=pNew;
	}
	return pHead;
}

//3.遍历
void traverse_list(PNODE pHead)
{
	PNODE p=pHead->pNext;
	while(p!=NULL)
	{
		cout<<p->data<<'\t';
		p=p->pNext ;
	}
	cout<<endl;
	return ;
}

//判空
bool is_empt(PNODE pHead)
{
	if(pHead->pNext==NULL)
		return true;
	else
		return false;
}

//求长度
int length_list(PNODE pHead)
{
	PNODE p=pHead->pNext;
	int len=0;
	while(p!=NULL)
	{
		len++;
		p=p->pNext;
	}
	return len;
}

//4. 插入/删除:在pHead所指向链表的第pos个节点的前面插入一个新的节点,新节点的值是val,并且pos的值是从1开始。
bool insert_list(PNODE pHead,int pos,int val)
{
	int i=0;
	cout<<"请输入需要插入元素的位置和值"<<endl;
	cin>>pos>>val;
	PNODE p=pHead;
	while(p!=NULL&&i<pos-1)
	{
		p=p->pNext ;
		++i;
	}
	if(i>pos-1||p==NULL)
		return false;
	PNODE pNew=(PNODE)malloc(sizeof(NODE));
	if(pNew==NULL)
	{
		cout<<"动态分配内存失败!"<<endl;
		exit(-1);
	}
	pNew->data =val;
	PNODE q=p->pNext ;
	p->pNext =pNew;
	pNew->pNext =q;
	return true;
}

bool delete_list(PNODE pHead,int pos,int *pval)
{
	int i=0;
	PNODE p=pHead;
	cout<<"请输入需要删除的元素的位置"<<endl;
	cin>>pos;
	while(p!=NULL&&i<pos-1)
	{
		p=p->pNext ;
		++i;
	}
	if(i>pos-1||p==NULL)
		return false;
	PNODE q=p->pNext ;
	*pval=q->data ;
	p->pNext =p->pNext->pNext ;
	free(q);
	q=NULL;
	return true;
}

//5.查找:
int locate_list(PNODE p,int x)
{
	int i=1;
	p=p->pNext;
	while(p!=NULL&&p->data!=x)
	{
		p=p->pNext ;
		i++;
	}
	if(p==NULL)
		return 0;
	return i;
}


//6.排序(冒泡):
void sort_list(PNODE pHead)
{
	int i,j,t;
	int len=length_list(pHead);
	PNODE p,q;
	for(i=0,p=pHead->pNext;i<len-1;++i,p=p->pNext)
	{
		for(j=i+1,q=p->pNext;j<len;++j,q=q->pNext)
		{
			if(p->data>q->data)//类似于数组中的:a[i]>a[j]
			{
				t=p->data;//类似于数组中的:	t=a[i];
				p->data=q->data;//类似于数组中的:	a[i]=a[j];
				q->data=t;//类似于数组中的:	a[j]=t;
			}
		}
	}

}

int main()
{
	PNODE pHead=NULL;
	NODE *head=NULL; 
    int val=12,pos=10,x,loc;
	pHead=creat_list();
	traverse_list(pHead);
	int len=length_list(pHead);
	cout<<"链表的长度是:"<<len<<endl;
	if(is_empt(pHead))
		cout<<"链表为空!"<<endl;
	else
		cout<<"链表不空!"<<endl;

	if(insert_list(pHead,pos,val))
		cout<<"插入成功!"<<endl;
	else
		cout<<"插入失败!"<<endl;
	cout<<"插入之后的链表内容是:"<<endl;
	traverse_list(pHead);

	if(delete_list(pHead,pos,&val))
		cout<<"删除成功!"<<endl;
	else
		cout<<"删除失败!"<<endl;
	cout<<"删除之后的链表内容是:"<<endl;
	traverse_list(pHead);

	cout<<"请输入需要查找的元素的值:"<<endl;
	cin>>x;
	loc=locate_list(pHead,x);
	if(loc>0)
	{
		cout<<"找到了!"<<endl;
		cout<<x<<"是链表中第"<<loc<<"个元素"<<endl;
	}
	else
		cout<<"查找失败!"<<endl;
	
	sort_list(pHead);
	traverse_list(pHead);
	return 0;
}

链表和数组是数据结构最基本的地基,同时它们也为以后的树图结构做了引申,就像血骨一样最基础也最要紧。

猜你喜欢

转载自blog.csdn.net/qq_43595030/article/details/90727832
今日推荐