#include <stdio.h>
#include <stdlib.h>
#include "list.h"
typedef struct list {
int data;
struct list *next;
} LIST;
LIST* createListRear(int *a, int len);
LIST* createListHead(int *a, int len);
LIST* findMiddleElement(LIST *head);
LIST* reverseList(LIST *head);
void printList(LIST *head);
int main()
{
int a[] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int len = sizeof(a) / sizeof(int);
LIST *list;
LIST *middle;
LIST *reversedList;
list = createListRear(a, len);
// list = createListHead(a, len);
printList(list);
printf("\n***************************\n");
reversedList = reverseList(list);
printList(reversedList);
// middle = findMiddleElement(list);
// printf("middle element: %d\n", middle->data);
return 0;
}
/* reverse a single linked list */
LIST* reverseList(LIST *head)
{
LIST *a, *b;
LIST *curNode;
if ( NULL == head ) {
printf("null list.\n");
return NULL;
}
curNode = head->next;
if ( NULL == curNode ) return NULL;
head->next = NULL;
while ( curNode != NULL ) {
a = curNode->next;
curNode->next = head->next;
head->next = curNode;
curNode =a;
}
return head;
}
/* find the middle element in single list */
LIST* findMiddleElement(LIST *head)
{
LIST *a, *b;
if ( NULL == head ) return NULL;
if ( NULL == head->next ) return NULL;
a = b = head->next;
while ( b->next != NULL && b->next->next != NULL ) {
a = a->next;
b = b->next->next;
}
return a;
}
LIST* createListRear(int *data, int len)
{
LIST *head, *rear, *newNode;
int i;
if ( data == NULL || len == 0 ) {
printf("null data.\n");
return NULL;
}
if ( (head = (LIST *)malloc(sizeof(LIST))) == NULL ) {
return NULL;
}
head->data = len;
head->next = NULL;
rear = head;
for ( i = 0; i < len; i++ ) {
if ( (newNode = (LIST *)malloc(sizeof(LIST))) == NULL ) {
return NULL;
}
newNode->data = data[i];
newNode->next = rear->next;
rear->next = newNode;
rear = newNode;
}
return head;
}
LIST* createListHead(int *a, int len)
{
LIST *head;
LIST *newNode;
int i;
if ( a == NULL || len == 0 ) {
printf("null data.\n");
return NULL;
}
if ( (head = (LIST *)malloc(sizeof(LIST))) == NULL ) {
printf("memory not available.\n");
return NULL;
}
head->data = len;
head->next = NULL;
for ( i = 0; i < len; i++ ) {
if ( (newNode = (LIST *)malloc(sizeof(LIST))) == NULL ) {
printf("memory not available.\n");
return NULL;
}
newNode->data = a[i];
newNode->next = head->next;
head->next = newNode;
}
return head;
}
void printList(LIST *head)
{
LIST *curNode;
curNode = head;
printf("List print: ");
while ( curNode->next != NULL ) {
curNode = curNode->next;
printf("%d\t", curNode->data);
}
}
单链表的基本操作
最新推荐文章于 2023-08-16 17:51:34 发布