单链表复习篇

/*
**********************************************************
*FileName:list.h
*Function:
*Version:version_1
*Author:yuanweikang
*Date:2015/7/30
*Note:
**********************************************************
*/

#ifndef LIST_H
#define LIST_H

#define FALSE 0
#define TRUE 1
#define Status int
#define DATATYPE int

typedef struct node
{
 DATATYPE data;
 struct node *next;
} Node;

typedef struct list
{
 Node *head;
 int length;
} List;

Node *CreateNode(DATATYPE data);
List *CreateList(DATATYPE data);
Status ClearList(List *list);
Status DestroyList(List **list);
Status AppendList(List *list, DATATYPE data);
Status AddList(List *list, DATATYPE data);
Status PrintList(List *list);
Status DeletePosList(List *list, int pos);
Status DeleteDataList(List *list, DATATYPE data);
Status InsertList(List *list, int pos, DATATYPE data);
Status BubbleSortNodeList(List *list);
Status BubbleSortDataList(List *list);
Status TravelList(List *list, Status (*func)(DATATYPE ));
Status PrintData(DATATYPE data);
Status ReverseList(List *list);

#endif

 

/*
**********************************************************
*FileName:list.c
*Function:
*Version:version_1
*Author:yuanweikang
*Date:2015/7/30
*Note:
**********************************************************
*/

#include <stdlib.h>
#include <stdio.h>
#include "list.h"

Node *CreateNode(DATATYPE data)
{
 Node *newNode = (Node *)malloc(sizeof(Node));
 if (newNode == NULL)
 {
  return NULL;
 }

 newNode->data = data;
 newNode->next = NULL;

 return newNode;
}

List *CreateList(DATATYPE data)
{
 Node *newNode = CreateNode(data);
 if (newNode == NULL)
 {
  return NULL;
 }
 List *newList = (List *)malloc(sizeof(List));
 if (newList == NULL)
 {

   /*空间分配失败后,退出之前需要释放已经分配的空间*/

  free(newNode);

  newNode = NULL;

  return NULL;

}

newList->head = newNode;

newList->length = 0;

 return newList;
}

Status ClearList(List *list)
{
 if ((list == NULL) || (list->head == NULL))
 {
  return FALSE;
 }
 Node *tempNode = list->head->next;
 Node *oldNode = tempNode;
 while (tempNode != NULL)
 {
  tempNode = tempNode->next;
  free(oldNode);
  oldNode = NULL;
  oldNode = tempNode;
 }
 list->length = 0;
 return TRUE;
}

Status DestroyList(List **list)
{
 if ((list == NULL) || (*list == NULL) || ((*list)->head == NULL))
 {
  return FALSE;
 }
 if (ClearList(*list) == FALSE)
 {
  return FALSE;
 }
 Node *oldNode = (*list)->head;
 free(oldNode);
 oldNode = NULL;
 free(*list);
 *list = NULL;
 list = NULL;
 return TRUE;
}

Status AppendList(List *list, DATATYPE data)
{
 if ((list == NULL) || (list->head == NULL))
 {
  return FALSE;
 }
 Node *newNode = CreateNode(data);
 if (newNode == NULL)
 {
  return FALSE;
 }
 Node *tempNode = list->head;
 while (tempNode->next != NULL)
 {
  tempNode = tempNode->next;
 }
 tempNode->next = newNode;
 list->length++;
 return TRUE;
}

Status AddList(List *list, DATATYPE data)
{
 if ((list == NULL) || (list->head == NULL))
 {
  return FALSE;
 }
 Node *newNode = CreateNode(data);
 if (newNode == NULL)
 {
  return FALSE;
 }
 if (list->head->next == NULL)
 {
  list->head->next = newNode;
 }
 else
 {
  newNode->next = list->head->next;
  list->head->next = newNode;
 }
 list->length++;
 return TRUE;
}

int LengthList(List *list)
{
 if ((list == NULL) || (list->head == NULL))
 {
  return -1;
 }
 Node *tempNode = list->head->next;
 int length = 0;
 while (tempNode != NULL)
 {
  length++;
  tempNode = tempNode->next;
 }
 return length;
}

Status PrintList(List *list)
{
 if ((list == NULL) || (list->head == NULL))
 {
  return FALSE;
 }
 Node *tempNode = list->head->next;
 printf("list:  ");
 while (tempNode != NULL)
 {
  printf("%d  ", tempNode->data);
  tempNode = tempNode->next;
 }
 printf("\n");
 printf("the length is:%d\n", list->length);
 return TRUE;
}

Status DeletePosList(List *list, int pos)
{
 if ((list == NULL) || (list->head == NULL) || (pos < 1) || (pos > list->length))
 {
  return FALSE;
 }
 int i = 0;
 Node *tempNode = list->head;
 Node *oldNode = tempNode->next;
 for (i=1; i<=list->length; i++)
 {
  if (pos == i)
  {
   tempNode->next = oldNode->next;
   free(oldNode);
   oldNode = NULL;
   list->length--;
   return TRUE;
  }
  tempNode = tempNode->next;
  oldNode = tempNode->next;
 }
}

Status DeleteDataList(List *list, DATATYPE data)
{
 if ((list == NULL) || (list->head == NULL) || (list->length == 0))
 {
  return FALSE;
 }
 Node *tempNode = list->head;
 Node *oldNode = tempNode->next;
 while (tempNode != NULL)
 {
  if (oldNode->data == data)
  {
   tempNode->next = oldNode->next;
   free(oldNode);
   oldNode = NULL;
   list->length--;
   return TRUE;
  }
  tempNode = tempNode->next;
  oldNode = tempNode->next;
 }
 return FALSE;

}

Status InsertList(List *list, int pos, DATATYPE data)
{
 if ((list == NULL) || (list->head == NULL) || (pos < 1) || (pos > list->length))
 {
  return FALSE;
 }
 Node *newNode = CreateNode(data);
 if (newNode == NULL)
 {
  return FALSE;
 }
 Node *tempNode = list->head;
 int i = 0;
 for (i=1; i<list->length; i++)
 {
  if (i == pos)
  {
   newNode->next = tempNode->next;
   tempNode->next = newNode;
   list->length++;
   return TRUE;
  }
  tempNode = tempNode->next;
 }
}

Status BubbleSortNodeList(List *list)
{
 if ((list == NULL) || (list->head == NULL) || (list->length <= 1))
 {
  return FALSE;
 }
 DATATYPE tempData = 0;
 Node *tempNode = list->head->next;
 Node *tailNode = NULL;
 while (list->head->next->next != tailNode)
 {
  while (tempNode->next != tailNode)
  {
   if (tempNode->data > tempNode->next->data)
   {
    tempData = tempNode->data;
    tempNode->data = tempNode->next->data;
    tempNode->next->data = tempData;
   }
   tempNode = tempNode->next;
  }
  tailNode = tempNode;
  tempNode = list->head->next;
 }
 return TRUE;
}

Status BubbleSortDataList(List *list)
{
 if ((list == NULL) || (list->head == NULL) || (list->length <= 1))
 {
  return FALSE;
 }
 int i = 0;
 int j = 0;
 Node *tempNode = list->head->next;
 DATATYPE tempData = 0;
 for (i=0; i<list->length - 1; i++)
 {
  for (j=0; j<list->length - 1 - i; j++)
  {
   if (tempNode->data > tempNode->next->data)
   {
    tempData = tempNode->data;
    tempNode->data = tempNode->next->data;
    tempNode->next->data = tempData; 
   }
   tempNode = tempNode->next;
  }
  tempNode = list->head->next;
 }
 return TRUE;
}

Status TravelList(List *list, Status (*func)(DATATYPE ))
{
 if ((list == NULL) || (list->head == NULL))
 {
  return FALSE;
 }
 Node *tempNode = list->head->next;
 printf("list:  ");
 while (tempNode != NULL)
 {
  if (func(tempNode->data) == FALSE)
  {
   return FALSE;
  }
  tempNode = tempNode->next;
 }
 printf("\n");
 printf("the list length is:%d\n", list->length);
 return TRUE;
}

Status PrintData(DATATYPE data)
{
 printf("%d  ", data);
 return TRUE;
}

Status ReverseList(List *list)
{
 if ((list == NULL) || (list->head == NULL) || (list->length <= 1))
 {
  return FALSE;
 }
 Node *tempNode = list->head->next;
 Node *reverseNode = NULL; 
 while (tempNode->next != NULL)
 {
  reverseNode = tempNode->next;
  tempNode->next = reverseNode->next;
  reverseNode->next = list->head->next;
  list->head->next = reverseNode;
 }
 return TRUE;
}

 

/*
**********************************************************
*FileName:main.c
*Function:
*Version:version_1
*Author:yuanweikang
*Date:2015/7/30
*Note:
**********************************************************
*/

#include <stdio.h>
#include "list.h"

int main(int argc, char *argv[])
{
 int i = 0;
 int a[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
 
 List *list = CreateList(0);
 for (i=0; i<5; i++)
 {
  AddList(list, a[i]);
 }
 for (i=0; i<5; i++)
 {
  AppendList(list, a[i + 5]);
 }
 PrintList(list);
 DeletePosList(list, 1);
 PrintList(list);
 DeleteDataList(list, 1);
 PrintList(list);
 InsertList(list, 1, 11);
 printf("after insert\n");
 PrintList(list);
 //BubbleSortNodeList(list);
 BubbleSortDataList(list);
 printf("after bubble sort\n");
 PrintList(list);
 printf("LengthList=%d\n", LengthList(list));
 InsertList(list, 5, 12);
 printf("after insert\n");
 TravelList(list, PrintData);
 ReverseList(list);
 printf("after reverse\n");
 TravelList(list, PrintData);
 DestroyList(&list);

 if (PrintList(list) == FALSE)
 {
  printf("list destroy success\n");
 }
 
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值