Linked Lists

This reads numbers from the standard input, and sorts them in increasing numerical order. It then prints the sorted numbers.

/*
 * LINKED LIST SORTER
 *
 * This program reads in numbers and sorts them in increasing numerical order
 * The data structure used is a linked list; each element looks like this:
 *	+--------------+
 *	|  data field  |  <--- holds the integer that you read in
 *	+--------------+
 *	|  next field  |  <--- holds pointer to next element in  list
 *	+--------------+       (NULL if nothing follows it)
 *
 * The pointer variable "head" contains a pointer to the first element in
 * the linked list (NULL if there are no elements in the linked list)
 */
#include <stdio.h>
#include <stdlib.h>
 
/*
 * structure for the list
 */
struct num {
	int data;		/* data field (the number to be sorted)  */
	struct num *next;	/* points to next element in linked list */
				/* (NULL pointer if no next element)     */
};
 
/*
 * pointer to the first element (the head) of the list
 * NULL if there's nothing in the list
 */
struct num *head = NULL;
 
/*
 * create a new node
 * and initialize the two fields
 */
struct num *createnode(int n)
{
	struct num *p;		/* pointer to new space */
 
	/* create the element, reporting errors */
	if ((p = malloc(sizeof(struct num))) == NULL)
		return(NULL);
 
	/* initialize the element */
	p->data = n;
	p->next = NULL;
 
	/* return a pointer to the new entity */
	return(p);
}
 
/*
 * insert the element that new points to into the linked list,
 * and return a pointer to the (possibly new) head of the list
 */
struct num *insert(struct num *new)
{
	struct num *prev, *temp;	/* pointers used to insert new element */
 
	/* empty list: put head at the front */
	if (head == NULL)
		return(new);
 
	/* it goes before the first element */
	if (head->data > new->data){
		new->next = head;
		return(new);
	}
 
	/*
	 * now walk the list
	 * from here on in, prev->next == temp
	 * we'll insert after prev and before temp
	 */
	prev = head;
	temp = head->next;
	while(temp != NULL && temp->data < new->data){
		/* advance prev and temp */
		prev = temp;
		temp = temp->next;
	}
 	/*
	 * here's the insertion
	 * make prev->nect the new element
	 * and new->next the one temp points to
	 */
	new->next = temp;
	prev->next = new;
 
	/* return the pointer to the head of the list */
	return(head);
}
 
/*
 * the main routine
 * read in numbers and sort them
 */
int main(void)
{
	int i;		/* number of numbers read by scanf */
	int n;		/* what scanf read */
	struct num *p;	/* pointer to element for linked list */
 
	/*
	 * loop through the input
	 */
	while((i = scanf("%d", &n)) != EOF){
 
		/* error check; was a number read? */
		if (i == 0){
			/* no; give error message and print rest of line */
			fprintf(stderr, "illegal number: ");
			while((i = getchar()) != EOF && i != '\n')
				fputc(i, stderr);
			fputc('\n', stderr);
			continue;
		}
 
		/* create a new node, and print error message if failure */
		if ((p = createnode(n)) == NULL){
			fprintf(stderr, "no more memory on input %d\n", n);
			return(EXIT_FAILURE);
		}
 
		/* insert new element into linked list */
		head = insert(p);
	}
 
	/* skip to next line, for cleaner output */
	putchar('\n');
 
	/*
	 * print the list
	 * start at the head, print the data field of each element
	 * and go on to the next
	 */
	for(p = head; p != NULL; p = p->next)
		printf("%d\n", p->data);
 
	/* bye-bye */
	return(EXIT_SUCCESS);
}

ECS 30-A, Introduction to Programming
Spring Quarter 2002
Email: cs30a@cs.ucdavis.edu