版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
双向链表的构造:
#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 ;
}