-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathll_sorted.c
More file actions
132 lines (114 loc) · 3.28 KB
/
ll_sorted.c
File metadata and controls
132 lines (114 loc) · 3.28 KB
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
/* File: ll_sorted
*
* Purpose: Implement a sorted linked list with ops Insert
* and Print.
*
* Input: Single character lower case letters to indicate operations,
* followed by arguments needed by operations.
*
* Output: Results of operations.
*
* Compile: gcc -g -Wall -o lls ll_sorted.c
* Run: ./lls
*
* Notes:
* 1. Repeated values are allowed in the list
* 2. Program assumes an int will be entered when prompted
* for one.
* 3. The insert function is missing some code ...
*/
#include <stdio.h>
#include <stdlib.h>
struct list_node_s {
int data;
struct list_node_s* next_p;
};
struct list_node_s* Insert(struct list_node_s* head_p, int val);
void Print(struct list_node_s* head_p);
char Get_command(void);
int Get_value(void);
/*-----------------------------------------------------------------*/
int main(void) {
char command;
int value;
struct list_node_s* head_p = NULL;
/* start with empty list */
command = Get_command();
while (command != 'q' && command != 'Q') {
switch (command) {
case 'i':
case 'I':
value = Get_value();
head_p = Insert(head_p, value);
break;
case 'p':
case 'P':
Print(head_p);
break;
default:
printf("There is no %c command\n", command);
printf("Please try again\n");
}
command = Get_command();
}
return 0;
} /* main */
/*-----------------------------------------------------------------*/
struct list_node_s* Insert(struct list_node_s* head_p, int val) {
struct list_node_s* curr_p = head_p;
struct list_node_s* pred_p = NULL;
struct list_node_s* temp_p;
while (curr_p != NULL) {
if (curr_p->data >= val)
break;
pred_p = curr_p;
curr_p = curr_p->next_p;
}
// Create new node
temp_p = malloc(sizeof(struct list_node_s));
temp_p->data = val;
temp_p->next_p = curr_p;
if(pred_p == NULL)
head_p = temp_p;
else
pred_p->next_p = temp_p;
return head_p;
} /* Insert */
/*-----------------------------------------------------------------
* Function: Print
* Purpose: print list on a single line of stdout
* Input arg: head_p
*/
void Print(struct list_node_s* head_p) {
struct list_node_s* curr_p = head_p;
printf("list = ");
while (curr_p != NULL) {
printf("%d ", curr_p->data);
curr_p = curr_p->next_p;
}
printf("\n");
} /* Print */
/*-----------------------------------------------------------------
* Function: Get_command
* Purpose: Get a single character command from stdin
* Return value: The first non-whitespace character from stdin
*/
char Get_command(void) {
char c;
printf("Please enter a command (i, p, q): ");
/* Put the space before the %c so scanf will skip white space */
scanf(" %c", &c);
return c;
} /* Get_command */
/*-----------------------------------------------------------------
* Function: Get_value
* Purpose: Get an int from stdin
* Return val: The next int in stdin
* Note: Behavior unpredictable if an int isn't entered
*/
int Get_value(void) {
int val;
printf("Please enter a value: ");
scanf("%d", &val);
return val;
} /* Get_value */