本题目要求读入一系列整数,依次插入到双向循环链表的头部和尾部,然后顺序和逆序输出链表。
链表节点类型可以定义为
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
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");
}