目录

C++单链表尾插法

题目 尾插法(数据结构严蔚敏C语言版的C++实现)

输入:键盘输入

输出:带头结点的单链表L

处理方法:待插结点*s插入到最后一个结点之后。

步骤:

1
2
3
4
5
1)获得最后一个结点的位置,使p指向该结点              
2)p->next = new LNode;          
3)p = p->next;              
4)cin>>p->data;             
5)p->next = NULL;           

分析:要想获取最后一个结点的位置,必须从头指针开始顺着next链搜索链表的全部结点,该过程的时间复杂度是O( )。如果每次插入都按此方法获取最后一个结点的位置,则整个创建算法的时间复杂度为O( )。

一、问题分析

创建一个单链表,在尾插函数中添加尾指针,将输入获的int类型数据元素一个个尾插到单链表最后一个。

二、代码

对于问题三进行求解,设计了Tail_Insert函数,代码如下

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
void Tail_Insert(LinkList &L)
{
    int e;
    LNode *p, *s;
    L = new LNode;
    L->next = NULL;//定义头结点
    p = L;         //p是L的尾指针
    cout<<"请输入节点(输入0结束并输出结果):"<<endl;
    cin >> e;      //从键盘输入一个结点
    while (e != 0) 
    {
        s = new LNode;
        s->data = e;
        s->next = NULL;
        p->next = s;
        p = s;      //插入链表
        cin >> e;   //继续读
    }
}

三、分析

通过尾插法插入后,输入的数字是按照倒序在栈S中存储的,如果使用S进行输出,输出结果会是倒叙,需要再创建一个栈Q,将栈S中的元素顺序倒置,再由打印函数输出。

四、实验过程记录

我在码这个程序时碰到的困难是对指针节点的使用,试过在链接各节点时顺序弄反了,导致数据丢失了,后面经过一段排查后程序正常运行了。

完整代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
//显示中文
#define _CRT_SECURE_NO_WARNINGS
#include <windows.h>//用于函数SetConsoleOutputCP(65001);更改cmd编码为utf8
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#include<iostream>
using  namespace std;

typedef int ElemType;
typedef int status;

//创建节点结构体
typedef struct LNode 
{
	ElemType   data;
	struct  LNode *next;
}LNode, *LinkList;

//初始化
status InitList(LinkList&L) 
{
	L = new LNode;
	if (!L) exit(OVERFLOW);
	L->next = NULL;
	return OK;
}

//
status Getelem(LinkList L, int i, ElemType&e)
{
	LNode *p; int j;
	p = L->next; j = 1;
	while (p&&j < 1)
	{
		p = p->next;
		j++;
	}
	if (!p || j > i)return ERROR;
	e = p->data;
	return OK;
}

void Tail_Insert(LinkList &L)
{
	int e;
	LNode *p, *s;
	L = new LNode;
	L->next = NULL;//定义头结点
	p = L;         //p是L的尾指针
	cout<<"请输入节点(输入0结束并输出结果):"<<endl;
	cin >> e;      //从键盘输入一个结点
	while (e != 0) 
	{
		s = new LNode;
		s->data = e;
		s->next = NULL;
		p->next = s;//插入链表
		p = s;		//更新尾指针
		cin >> e;   //继续读
	}
}

//打印
void PrintList(LinkList L)
{
	LinkList tem = L;
	while (tem->next != NULL)
	{
		tem = tem->next;
		cout << tem->data << " ";
	}
}

//实验3
void test()
{
	LinkList L;
	Tail_Insert(L);
	cout << "输出:";
	PrintList(L);
	cout<<endl;
}

int main()
{
	//显示中文
    SetConsoleOutputCP(65001);
	
	//实验3
	test();
	
	system("pause");
	return 0;
}