带有头结点的单向循环链表

题目:

        创建带有头结点的循环链表,实现插入 、查询 、 删除等功能 。

源代码:

#include<iostream>
#include<malloc.h>
using namespace std;
typedef int elemtype; //定义结点类型 

//定义一个线性链表的类型
typedef struct node
{
	elemtype data; //数据域
	struct node *next; //指针域 
}node,*linklist;

//初始化链表 
linklist initlist()
{
	node *p;
	p = (node*)malloc(sizeof(node));
	if(p == NULL)
		cout<<"申请内存空间失败!"<<endl<<endl;
	else
	{
		p->next = NULL;
		cout<<"初始化成功!"<<endl<<endl; 
	}
}

//知晓长度创建链表
linklist creat(linklist list)
{
	node *p,*q;
    p = list;                          	  
	elemtype a,n; 
	cout<<"输入长度:";
	cin>>n;
	cout<<"输入元素:";                        
    while(n--)
    {
    	q=(node*)malloc(sizeof(node));
        scanf("%d",&q->data);
        q->next = NULL;
        p->next = q;
        p = q;
    } 
    return list;
} 

//不知晓长度创建链表
linklist creat1(linklist list)
{
	node *p,*q;
    p = list;                          	  
	elemtype a; 
	//以0为结束的标记 
	cout<<"输入元素:";                        
    while(cin>>a)
    {
    	if(a == 0)
    		break;
    	q=(node*)malloc(sizeof(node));
        q->data = a;
        q->next = NULL;
        p->next = q;
        p = q;
    } 
    return list;
} 
//求线性链表的长度
int length1(linklist list)
{
	linklist p = list;
	int n = 0;
	while(p!=NULL)
	{	
		n++;//计数器累加 
		p = p->next; //指针p指向下一个链结点 
	}
	return n;//返回链表的长度 
} 

//求线性链表的长度(递归)
int length2(linklist list)
{
	if(list!=NULL)
		return 1+length2(list->next);
	else
		return 0; 
} 

//确定元素item在线性链表中的位置
linklist find(linklist list,elemtype item)
{
	linklist p = list;
	int place = 1;
	while(p !=NULL && p->data != item)
	{
		place++;
		p = p->next;
	}
	if(p !=NULL && p->data == item)
		cout<<"item的位置为:"<<place<<endl;
	else
		cout<<"item不存在!"<<endl;
}

//非空线性链表的末尾插入一个数据信息为item的链接点
void insert1(linklist list,elemtype item)
{
	//list存放链表的首地址
	linklist p,r;
	r = list;
	while(r->next!=NULL)
		r = r->next;//找到链表末尾结点的地址 
	p = (linklist)malloc(sizeof(node));//申请一个新的链接点
	p ->data = item;//将item送新结点的数据域
	p ->next = NULL;//新结点的指针域置为NULL 
	r ->next =p;//插入链表的末尾 
}


//在线性链表中的第i个链结点后面插入一个数据信息为item的链接点
void insert2(linklist list,int i,elemtype item)
{
	linklist p,q = list;
	int j=1;
	while(j<i&&q!=NULL)
	{
		q = q ->next;
		j++; 
	}//寻找第i个链结点
	if(j!=i||q==NULL)
		printf("链表中不存在第i个链结点");
	p = (linklist)malloc(sizeof(node));//申请一个新的链结点
	p ->data = item;//将item送新结点的数据域
	p ->next = q ->next;
	q ->next = p;//将新结点插入第i个链结点之后
}

//在按值有序链接的线性链表中插入一个数据信息为item的链结点
linklist insert3(linklist &list,elemtype item)
{
	linklist p,q,r;
	p = (linklist)malloc(sizeof(node));
	p ->data = item;
	if(list==NULL||item<list->data)//若链表为空或者item小于第1个链结点 
	{
		p ->next = list;//将新的链结点插在链表最前面 
		list = p;//list指向被插入的新结点 
	}	
	else
	{
		q = list;
		while(q!=NULL&&item>=q->data)//寻找插入位置 
		{
			r = q;
			q = q->next;
		}
		p->next = q;
		r->next = p;//将新的链结点插在q指示的链结点后面 
	} 
	return list;
}

//逆转一个线性链表
void invert(linklist &list)
{
	linklist p,q,r;
	p = list;
	q = NULL;
	while(p!=NULL)
	{
		r = q;
		q = p;
		p = p->next;
		q->next = r;
	}
	list = q;
} 

node* getelem(linklist list,int k)
{
    node* s=list;
    while(k)
    {
        s=s->next;
        k--;
    }
    return s;
}

void deletelist3(linklist list,int k)
{
    node* p=list;
    node* q=NULL;
    p=getelem(list,k-1);
    q=p->next;
    p->next=q->next;
    free(q);

}

//销毁一个线性链表
void deletelist(linklist &list)
{
	linklist p = list;
	while(p!=NULL)
	{
		list = p->next;//保存下一个链结点的位置
		free(p);//删除并释放当前的链结点
		p = list;//下一个链结点成为当前链结点
	}
} 

//打印链表元素,遍历链表 
void printinfo(linklist list)
{
	node *head;
	if(head == NULL)//链表为空   
		cout<<"链表为空!"<<endl;
	//链表不为空则输出打印出元素 
	else 
	{
		cout<<"链表元素为:";
		for(head=list;head!=NULL;head=head->next)//第一个元素指向list  
			cout<<head->data<<" ";
		cout<<endl<<endl;
	}
}

int main()
{
	linklist list;
	elemtype n,item,i;
	
	//初始化链表
	cout<<"初始化链表!"<<endl; 
	list = initlist();
	
	//创建头结点
	list = (node*)malloc(sizeof(node));
    list->next = NULL;
    list->data = -1; 
	
	//创建链表(知晓长度) 
	cout<<"创建链表!"<<endl;
	list = creat(list); 
	printinfo(list);
	
	//创建链表(不知晓长度) 
	cout<<"创建链表,以0为结束标志!"<<endl; 
	list = creat1(list); 
	printinfo(list);
	
	//求链表的长度
	cout<<"链表的长度!"<<endl<<"链表长度为:"<<length1(list)<<endl;
	
	//求链表的长度
	cout<<"链表的长度!"<<endl<<"链表长度为:"<<length2(list)<<endl;
	
	//确定元素item在线性链表中的位置
	cout<<endl<<"元素item的位置!"<<endl;
	cout<<"输入元素item:";
	cin>>item; 
	find(list,item); 
	
	//非空线性链表的末尾插入一个数据信息为item的链接点	
	cout<<endl<<"末尾插入item结点!"<<endl;
	cout<<"输入元素item:";
	cin>>item; 
	insert1(list,item); 
	printinfo(list); 
	
	//在线性链表中的第i个链结点后面插入一个数据信息为item的链接点
	cout<<endl<<"第i个链结点后面插入item!"<<endl;
	cout<<"输入结点i:";
	cin>>i; 
	cout<<"输入元素item:";
	cin>>item; 
	insert2(list,i,item);
	printinfo(list);
	
	//在按值有序链接的线性链表中插入一个数据信息为item的链结点
	cout<<endl<<"按值有序在链表中插入item!"<<endl;
	cout<<"输入元素item:";
	cin>>item; 
	insert3(list,item);
	printinfo(list);
	
	//逆转一个线性链表
	cout<<endl<<"逆序链表!"<<endl; 
	invert(list);
	printinfo(list);
	invert(list);
	printinfo(list);
	
	//删除第i个结点
	cout<<endl<<"删除第i个结点!"<<endl; 
	cout<<"输入结点i:";
	cin>>i; 
	deletelist3(list,i);
	printinfo(list); 
	
	//销毁一个线性链表
	cout<<endl<<"销毁链表!"<<endl; 
	deletelist(list);
	printinfo(list);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_41943578/article/details/83067301
今日推荐