带头结点的双向链表操作

本题目要求读入一系列整数,依次插入到双向循环链表的头部和尾部,然后顺序和逆序输出链表。

链表节点类型可以定义为

typedef int DataType;
typedef struct LinkedNode{
    DataType data;
    struct LinkedNode *prev;
    struct LinkedNode *next;
}LinkedNode;

链表类型可以定义为

typedef struct LinkedList{
  int length; /* 链表的长度 */
  LinkedNode head; /* 双向循环链表的头节点 */
}LinkedList;

初始化链表的函数可声明为

void init_list(LinkedList *list);

分配节点的函数可声明为

LinkedNode *alloc_node(DataType data);

头部插入的函数可声明为

void push_front(LinkedList *list, DataType data);

尾部插入的函数可声明为

void push_back(LinkedList *list, DataType data);

顺序遍历的函数可声明为

void traverse(LinkedList *list);

逆序遍历的函数可声明为

void traverse_back(LinkedList *list);

输入格式:

输入一行整数(空格分隔),以-1结束。

输出格式:

第一行输出链表顺序遍历的结果,第二行输出逆序遍历的结果。

输入样例:

在这里给出一组输入。例如:

1 2 3 4 5 6 -1

输出样例:

5 3 1 2 4 6
6 4 2 1 3 5
带来一个我的解法~:
#include <iostream>
using namespace std;
typedef int DataType;
typedef struct LinkedNode
{
	DataType data;
	struct LinkedNode *prev;
	struct LinkedNode *next;
} LinkedNode;
typedef struct LinkedList
{
	int length;		  /* 链表的长度 */
	LinkedNode *head; /* 双向循环链表的头节点 */
} LinkedList;

void init_list(LinkedList *list);
void init_list(LinkedList *list)
{
	list->length = 0;
	list->head = new LinkedNode;
	list->head->next = NULL;
	list->head->prev = NULL;
}
LinkedNode *alloc_node(DataType data);
LinkedNode *alloc_node(DataType data)
{
	LinkedNode *l;
	l = new LinkedNode;
	l->data = data;
	l->next = NULL;
	l->prev = NULL;
	return l;
}
void push_front(LinkedList *list, DataType data);
void push_back(LinkedList *list, DataType data);
void traverse(LinkedList *list);
void traverse_back(LinkedList *list);
void test01();
void test01()
{
	LinkedList list, *pList = &list;
	init_list(pList);
	int data;
	int flag = 0;
	while (1)
	{
		cin >> data;
		if (data == -1)
		{
			break;
		}
		if (flag == 1)
		{
			push_back(pList, data);
			flag = 0;
		}
		else
		{
			push_front(pList, data);
			flag = 1;
		}
	}

	traverse(pList);
	traverse_back(pList);
}
void push_front(LinkedList *list, DataType data)
{
	LinkedNode *p;
	p = alloc_node(data);
	LinkedNode *t;
	t = list->head;
	while (t->prev)
	{
		t = t->prev;
	}

	t->prev = p;
	p->next = t;
}
void push_back(LinkedList *list, DataType data)
{
	LinkedNode *p;
	p = alloc_node(data);
	LinkedNode *t;
	t = list->head;
	while (t->next)
	{
		t = t->next;
	}

	t->next = p;
	p->prev = t;
}
void traverse(LinkedList *list)
{
	LinkedNode *t;
	t = list->head;
	int count = 0;
	while (t->prev)
	{
		t = t->prev;
	}
	while (t)
	{
		if (t == list->head)
		{
			t = t->next;
		}

		if (count == 0)
		{
			cout << t->data;
			count++;
		}
		else
		{
			cout << " " << t->data;
		}

		t = t->next;
	}
	cout << endl;
}
void traverse_back(LinkedList *list)
{
	LinkedNode *t;
	int count = 0;
	t = list->head;
	while (t->next)
	{
		t = t->next;
	}
	while (t)
	{
		if (t == list->head)
		{
			t = t->prev;
		}

		if (count == 0)
		{
			cout << t->data;
			count++;
		}
		else
		{
			cout << " " << t->data;
		}

		t = t->prev;
	}
	cout << endl;
}
int main()
{
	test01();
	system("pause");
}

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c0re

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值