【1】题目
【2】思路
递归实现
【3】源码
#include <iostream>
#include<fstream>
#include<vector>
#include <stdio.h>
#include <stdlib.h>
#define OK 0
#define ERROR -1
#define MALLOC_ERROR -2
using namespace std;
//注意
//[1]链表的头插法不需要保存链表的第一个位置信息,因为每次都是在当前节点之前插入新节点的
//[2]链表的尾插法需要保存链表的第一个位置信息,因为每次都是在当前节点之后插入新节点的
typedef int ElementType;
typedef struct node
{
ElementType data;
struct node *next;
}Node;
typedef Node *PNode;
//输入为上一个节点和需要存储的数据值,头插法,不要要保存第一个链表地址。
int Create_List_Head_START(PNode h, ElementType data)
{
if (h == NULL)
{
return ERROR;
}
//创建一个节点
PNode node = (PNode)malloc(sizeof(Node) / sizeof(char));
if (node == NULL)
{
return MALLOC_ERROR;
}
//数据赋值
node->data = data;
//当前节点的下一个节点为头结点的下一个节点,即为空节点
node->next = h->next;
//当前头节点的下一个指针为当前创建的指针
h->next = node;
return OK;
}
//输入为上一个节点和需要存储的数据值,尾插法,需要保存第一个节点的地址信息,即链表的起始地址
int Create_List_Head_END(PNode h, ElementType data)
{
if (h == NULL)
{
return ERROR;
}
//创建一个节点
PNode node = (PNode)malloc(sizeof(Node) / sizeof(char));
if (node == NULL)
{
return MALLOC_ERROR;
}
//数据赋值
node->data = data;
//当前节点的下一个节点为头结点的下一个节点,即为空节点
h->next = node;
node->next = NULL;
h = node;
return OK;
}
//正序打印链表
void DisPlay(PNode h)
{
if (h == NULL)
{
return;
}
PNode temp = h->next; // 链表第一个结点指针
while (temp)
{
printf("%4d", temp->data);
temp = temp->next;
}
printf("\n");
}
//反序打印链表
void BackDisPlay(PNode h)
{
if (h->next!=NULL)
{
if (h->next!= NULL)
{
BackDisPlay(h->next);
}
printf("%4d", h->next->data);
}
}
int main()
{
PNode head_node = (PNode)malloc(sizeof(Node) / sizeof(char));
if (head_node == NULL)
{
return ERROR;
}
head_node->next = NULL;
int i = 1;
for (i = 1; i < 10; i++)
{
if (Create_List_Head_START(head_node, i) != OK)
{
return ERROR;
}
}
DisPlay(head_node);
BackDisPlay(head_node);
cin.get();
return 0;
}