基算要素
tip
input&output
stdin | stdout |
---|---|
scanf() | printf() |
gets() | puts() |
getchar() | putchar() |
让gcc的cin和scanf一样快
1 | ios::sync_with_stdio(false); |
不要用局部变量地址返回地址
1 | int* func(){ |
这是错误的,从函数本身的意义来说,该函数应该返回一个指针,但是函数体内的arr是一个临时变量,所以返回arr后会由于临时变量的销毁导致函数返回的地址是一个无意义地址。所以要将int arr
静态化,或者改为全局函数
1 | int arr1[2] = {}; |
一个简单的函数辅助理解c++中指针和数组的联系
1 |
|
algorithm
指针&单链表链表
sudtoj-1138:单链表操作A
Description 输入n个整数,先按照数据输入的顺序建立一个带头结点的单链表,再输入一个数据m,将单链表中的值为m的结点全部删除。分别输出建立的初始单链表和完成删除后的单链表。
Input
第一行输入数据个数n;
第二行依次输入n个整数;
第三行输入欲删除数据m。
Output
第一行输出原始单链表的长度;
第二行依次输出原始单链表的数据;
第三行输出完成删除后的单链表长度;
第四行依次输出完成删除后的单链表数据。
Sample
Input
1
2
310
56 25 12 33 66 54 7 12 33 12
121
2
3
410
56 25 12 33 66 54 7 12 33 12
7
56 25 33 66 54 7 33
solutions 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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
using namespace std;
bool equal(int a, int b)
{
return a == b;
}
struct node
{
int data;
node *next = NULL;
};
node *create(int i)
{
node *head;
node *p;
head = new node();
p = head;
while (i--)
{
p->next = new node();
p = p->next;
cin >> p->data;
}
return head;
}
/**
* 创建逆序链表
*/
node *createR(int i)
{
node *head = new node();
node *p;
while (i--)
{
p = new node();
cin >> p->data;
p->next = head->next;
head->next = p;
}
return head;
}
node *delRepeatNode(node *head)
{
node *p, *q, *t4del;
p = head;
while (p->next != NULL)
{
p = p->next;
q = p;
while (q->next != NULL)
{
if (equal(q->next->data, p->data))
{
t4del = q->next;
q->next = q->next->next;
delete (t4del);
}
else
{
q = q->next;
}
}
}
return head;
}
node *delByData(node *head, int delData)
{
node *p, *t4del;
p = head;
while (p->next != NULL)
{
if (p->next->data == delData)
{
t4del = p->next;
p->next = p->next->next;
delete (t4del);
}
else
{
p = p->next;
}
}
return head;
}
int getCount(node *head)
{
node *p = head;
int counter = 0;
while (p->next != NULL)
{
p = p->next;
counter++;
}
return counter;
}
void printNodeList(node *head)
{
node *p = head;
int counter = 0;
while (p->next != NULL)
{
cout << p->next->data;
if (p->next->next != NULL)
{
cout << " ";
}
p = p->next;
}
cout << endl;
}
void testA()
{
int n = 0;
int waitDelData = 0;
cin >> n;
node *head = create(n);
cin >> waitDelData;
cout << getCount(head) << endl;
printNodeList(head);
head = delByData(head, waitDelData);
cout << getCount(head) << endl;
printNodeList(head);
}
void testB()
{
int n = 0;
cin >> n;
node *head = createR(n);
cout << getCount(head) << endl;
printNodeList(head);
head = delRepeatNode(head);
cout << getCount(head) << endl;
printNodeList(head);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
testA();
// testB();
return 0;
}
sdutoj-1139:单链表操作B
Description
按照数据输入的相反顺序(逆位序)建立一个单链表,并将单链表中重复的元素删除(值相同的元素只保留最后输入的一个)。 Input
第一行输入元素个数n;
第二行输入n个整数。
Output
第一行输出初始链表元素个数;
第二行输出按照逆位序所建立的初始链表;
第三行输出删除重复元素后的单链表元素个数;
第四行输出删除重复元素后的单链表。
Sample
Input
1
210
21 30 14 55 32 63 11 30 55 301
2
3
410
30 55 30 11 63 32 55 14 30 21
7
30 55 11 63 32 14 21
解答为上述代码的testB函数
sdutoj-2054:双向链表
1 |
|
sdutoj-2121:链表排序
1 |
|
循环链表(略)
贪心
活动选择问题
Description
sdut 大学生艺术中心每天都有n个活动申请举办,但是为了举办更多的活动,必须要放弃一些活动,求出每天最多能举办多少活动。
Input
输入第一行为申请的活动数n(n<100),从第2行到n+1行,每行两个数,是每个活动的开始时间b,结束时间e;
Output
输出每天最多能举办的活动数。
Sample
Input
1
2
3
4
5
6
7
8
9
10
11
12
1312
15 20
15 19
8 18
10 15
4 14
6 12
5 10
2 9
3 8
0 7
3 4
1 3
1
5
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
using namespace std;
struct actionTime
{
int startTime = 0;
int endTime = 0;
};
int main()
{
int n = 0;
actionTime actionTimeList[200] = {};
actionTime tmpActionTime;
while (int scanfResult = scanf("%d", &n))
{
if (scanfResult == EOF)
{
break;
}
for (int i = 0; i < n; i++)
{
cin >> actionTimeList[i].startTime >> actionTimeList[i].endTime;
}
for (int i = 0; i < n - 1; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (actionTimeList[j].endTime > actionTimeList[j + 1].endTime)
{
tmpActionTime = actionTimeList[j];
actionTimeList[j] = actionTimeList[j + 1];
actionTimeList[j + 1] = tmpActionTime;
}
}
}
// cout << "##############" << endl;
// for (int i = 0; i < n; i++)
// {
// cout << actionTimeList[i].startTime << " " << actionTimeList[i].endTime << endl;
// }
int j = 0;
int sum = 1;
for (int i = 1; i < n; i++)
{
if (actionTimeList[i].startTime >= actionTimeList[j].endTime)
{
sum++;
j = i;
}
}
cout << sum << endl;
}
return 0;
}
sdutoj-2136:数据结构实验之二叉树的建立与遍历
1 |
|
数据结构实验之求二叉树后序遍历和层次遍历
其中层次遍历有循环多次比较深度和队列两种方式实现
1 |
|