forked from amritanand-py/cps02
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathO 12 - LL03 - Printing Linked Lists.c
126 lines (96 loc) · 2.9 KB
/
O 12 - LL03 - Printing Linked Lists.c
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
#include <assert.h>
#include <limits.h>
#include <math.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* readline();
typedef struct LinkedListNode LinkedListNode;
struct LinkedListNode {
int val;
LinkedListNode *next;
};
LinkedListNode* _insert_node_into_singlylinkedlist(LinkedListNode *head, LinkedListNode *tail, int val) {
if (!head) {
head = malloc(sizeof(LinkedListNode));
head->val = val;
head->next = NULL;
tail = head;
} else {
LinkedListNode *node = malloc(sizeof(LinkedListNode));
node->val = val;
node->next = NULL;
tail->next = node;
tail = tail->next;
}
return tail;
}
//-------------------- head of the code ------------------------
/*
* Complete the function below.
*/
/*
For your reference:
LinkedListNode {
int val;
LinkedListNode *next;
};
*/
void printForward(LinkedListNode* head) {
printf("%d ",head->val);
if(head->next==NULL)
return;
printForward(head->next);
}
void printBackward(LinkedListNode* head) {
if(head==NULL)
return;
printBackward(head->next);
printf("%d ",head->val);
}
//-------------------- tail of the code ------------------------
int main()
{
char* head_size_endptr;
char* head_size_str = readline();
int head_size = strtol(head_size_str, &head_size_endptr, 10);
if (head_size_endptr == head_size_str || *head_size_endptr != '\0') { exit(EXIT_FAILURE); }
LinkedListNode* head = NULL;
LinkedListNode* head_tail = NULL;
for (int head_i = 0; head_i < head_size; head_i++) {
char* head_item_endptr;
char* head_item_str = readline();
int head_item = strtol(head_item_str, &head_item_endptr, 10);
if (head_item_endptr == head_item_str || *head_item_endptr != '\0') { exit(EXIT_FAILURE); }
head_tail = _insert_node_into_singlylinkedlist(head, head_tail, head_item);
if (!head_i) {
head = head_tail;
}
}
printForward(head);
printf("\n");
printBackward(head);
return 0;
}
char* readline() {
size_t alloc_length = 1024;
size_t data_length = 0;
char* data = malloc(alloc_length);
while (true) {
char* cursor = data + data_length;
char* line = fgets(cursor, alloc_length - data_length, stdin);
if (!line) { break; }
data_length += strlen(cursor);
if (data_length < alloc_length - 1 || data[data_length - 1] == '\n') { break; }
size_t new_length = alloc_length << 1;
data = realloc(data, new_length);
if (!data) { break; }
alloc_length = new_length;
}
if (data[data_length - 1] == '\n') {
data[data_length - 1] = '\0';
}
data = realloc(data, data_length);
return data;
}