双向链表的一些操作

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_44116998/article/details/101691132

双向链表的构造:

#include<iostream>
using namespace std;
typedef struct Node *list;
typedef struct Node  listlink;
struct Node{
	char value;
	list leftptr;
	list rightptr;
};
void Input();
void Output(list );
int main()
{
	char c;
	Input();
}
void Input()
{
	char c; 
	list current,link = NULL,temp = link;
	printf("请输入数据,以回车结束\n"); 
	while((c = getchar()) != '\n')
	{
		current = (list)malloc(sizeof(listlink));
		current->value = c;
		current->leftptr = NULL;
		current->rightptr = NULL;
		if( !link ){//头节点为空时 
			link = current;
			temp = current;
		}
		else{
			temp->rightptr = current;
			current->leftptr = temp; 
			temp = temp->rightptr;
		}    
	}
	Output(link);
	return ;
}
void Output(list link)
{
	list temp;
	printf("双向链表从左到右输出\n"); 
	while( link != NULL){
		printf("%c ",link->value);
		temp = link;//记录前驱结点 
		link = link->rightptr;
	}
	printf("\n");
	printf("双向链表从右到左输出\n"); 
	while(temp != NULL){
		printf("%c ",temp->value);
		temp = temp->leftptr;
	 }
 return ;
}

双向链表的排序操作(此处显示按从大到小排序):
本来开始的时候是采用链表的指针的交换,后来发现不好做啊,我是这样写的,发现交换之后没有按照预期的方向进行,因为它可能不会按照冒泡的依次顺序来实现。

void Queue(list *link)
{
	list temp = NULL,current = NULL,leftptr = NULL,rightptr = NULL,left = NULL,right = NULL,tt; 
	for(temp = *link; temp ; temp = temp->rightptr)
	{
		tt = tmep;
		for(current = temp->rightptr; current ;current = current->rightptr)
		{
			if(current->value > temp->value)
			{
			rightptr = current->rightptr; 
			leftptr = current->leftptr;
			left = temp->leftptr; 
			right = temp->rightptr;
			
			if(rightptr != NULL)//右节点可能为空 
			 rightptr->leftptr = temp;
			leftptr->rightptr = temp;
			temp->leftptr = leftptr;
			temp->rightptr = rightptr;
			
			if(left != NULL)//左节点可能为空 
			 left->rightptr = current;
			right->leftptr = current;
			current->leftptr = left;
			current->rightptr = right; 
			}  
		} 
	}
	while(tt != NULL){//找左边头节点 
		current = tt;
		tt = temp->leftptr;
	}
	*link = current;
	Output(*link);
}

只好交换值了:

void Queue(list link)
{
	list temp = NULL,current = NULL; 
	for(temp = link; temp ; temp = temp->rightptr)
	{
		for(current = temp->rightptr; current ;current = current->rightptr)
		{
			if(current->value > temp->value)
			{
				int t = current->value;
				current->value = temp->value;
				temp->value = t; 
			}  
		} 
	}
}

双向队列插入操作(默认插在比它小的数前面)

void Enqueue(list *link,int n)
{
	list temp = *link,current,rightptr; 
	if(n > temp->value)//头部 
	{
		current = (list)malloc(sizeof(listlink));
		current->value = n;
		current->leftptr = NULL;
		current->rightptr = temp;
		temp->leftptr = current;
		*link = current;
	}
	else//中尾部 
	{
		while(temp != NULL && temp->value > n){
			current = temp;
			temp = temp->rightptr;
		} 
		rightptr = (list)malloc(sizeof(listlink));
		rightptr->value = n;
		if(current->leftptr != NULL)//可能为末尾
			current->rightptr->leftptr = rightptr; 
		rightptr->leftptr = current;
		rightptr->rightptr = current->rightptr;
		current->rightptr = rightptr;
	} 
	return ;
}

双向队列删除操作

void Dequeue(list *link,int n)
{
	list temp = *link,current,rightptr; 
	if(n == temp->value){//头部 
		temp = temp->rightptr;
		temp->leftptr = NULL;
		*link = temp;
	}
	else//中尾部 
	{
		while(temp != NULL && temp->value != n){
			current = temp;
			temp = temp->rightptr;
		} 
		current->rightptr = current->rightptr->rightptr;
		if(current->rightptr->rightptr != NULL)
		current->rightptr->leftptr = current;
	} 
return ;
}

猜你喜欢

转载自blog.csdn.net/qq_44116998/article/details/101691132