Mastering Algorithms with C(List)

写在前面:此处只为自己方便查找,不是解释性材料

(1)list.h

/*****************************************************************************
*                                                                            *
*  -------------------------------- list.h --------------------------------  *
*                                                                            *
*****************************************************************************/

#ifndef LIST_H
#define LIST_H

#include <stdlib.h>
#include <string.h>

/*****************************************************************************
*                                                                            *
*  Define a structure for linked list elements.                              *
*                                                                            *
*****************************************************************************/

typedef struct ListElmt_ {

void               *data;
struct ListElmt_   *next;

} ListElmt;

/*****************************************************************************
*                                                                            *
*  Define a structure for linked lists.                                      *
*                                                                            *
*****************************************************************************/

typedef struct List_ {

int                size;

int                (*match)(const void *key1, const void *key2);
void               (*destroy)(void *data);

ListElmt           *head;
ListElmt           *tail;

} List;

/*****************************************************************************
*                                                                            *
*  --------------------------- Public Interface ---------------------------  *
*                                                                            *
*****************************************************************************/

void list_init(List *list, void (*destroy)(void *data));

void list_destroy(List *list);

int list_ins_next(List *list, ListElmt *element, const void *data);

int list_rem_next(List *list, ListElmt *element, void **data);

#define list_size(list) ((list)->size)

#define list_head(list) ((list)->head)

#define list_tail(list) ((list)->tail)

#define list_is_head(list, element) ((element) == (list)->head ? 1 : 0)

#define list_is_tail(element) ((element)->next == NULL ? 1 : 0)

#define list_data(element) ((element)->data)

#define list_next(element) ((element)->next)


void list_init(List *list, void (*destroy)(void *data)) {



/*****************************************************************************

*                                                                            *

*  Initialize the list.                                                      *

*                                                                            *

*****************************************************************************/



list->size = 0;

list->destroy = destroy;

list->head = NULL;

list->tail = NULL;



return;



}



/*****************************************************************************

*                                                                            *

*  ----------------------------- list_destroy -----------------------------  *

*                                                                            *

*****************************************************************************/



void list_destroy(List *list) {



void               *data;



/*****************************************************************************

*                                                                            *

*  Remove each element.                                                      *

*                                                                            *

*****************************************************************************/



while (list_size(list) > 0) {



   if (list_rem_next(list, NULL, (void **)&data) == 0 && list->destroy !=

      NULL) {



      /***********************************************************************

      *                                                                      *

      *  Call a user-defined function to free dynamically allocated data.    *

      *                                                                      *

      ***********************************************************************/



      list->destroy(data);



   }



}



/*****************************************************************************

*                                                                            *

*  No operations are allowed now, but clear the structure as a precaution.   *

*                                                                            *

*****************************************************************************/



memset(list, 0, sizeof(List));



return;



}



/*****************************************************************************

*                                                                            *

*  ----------------------------- list_ins_next ----------------------------  *

*                                                                            *

*****************************************************************************/



int list_ins_next(List *list, ListElmt *element, const void *data) {



ListElmt           *new_element;



/*****************************************************************************

*                                                                            *

*  Allocate storage for the element.                                         *

*                                                                            *

*****************************************************************************/



if ((new_element = (ListElmt *)malloc(sizeof(ListElmt))) == NULL)

   return -1;



/*****************************************************************************

*                                                                            *

*  Insert the element into the list.                                         *

*                                                                            *

*****************************************************************************/



new_element->data = (void *)data;



if (element == NULL) {



   /**************************************************************************

   *                                                                         *

   *  Handle insertion at the head of the list.                              *

   *                                                                         *

   **************************************************************************/



   if (list_size(list) == 0)

      list->tail = new_element;



   new_element->next = list->head;

   list->head = new_element;



   }



else {



   /**************************************************************************

   *                                                                         *

   *  Handle insertion somewhere other than at the head.                     *

   *                                                                         *

   **************************************************************************/



   if (element->next == NULL)

      list->tail = new_element;



   new_element->next = element->next;

   element->next = new_element;



}



/*****************************************************************************

*                                                                            *

*  Adjust the size of the list to account for the inserted element.          *

*                                                                            *

*****************************************************************************/



list->size++;



return 0;



}



/*****************************************************************************

*                                                                            *

*  ----------------------------- list_rem_next ----------------------------  *

*                                                                            *

*****************************************************************************/



int list_rem_next(List *list, ListElmt *element, void **data) {



ListElmt           *old_element;



/*****************************************************************************

*                                                                            *

*  Do not allow removal from an empty list.                                  *

*                                                                            *

*****************************************************************************/



if (list_size(list) == 0)

   return -1;



/*****************************************************************************

*                                                                            *

*  Remove the element from the list.                                         *

*                                                                            *

*****************************************************************************/



if (element == NULL) {



   /**************************************************************************

   *                                                                         *

   *  Handle removal from the head of the list.                              *

   *                                                                         *

   **************************************************************************/



   *data = list->head->data;

   old_element = list->head;

   list->head = list->head->next;



   if (list_size(list) == 1)

      list->tail = NULL;



   }



else {



   /**************************************************************************

   *                                                                         *

   *  Handle removal from somewhere other than the head.                     *

   *                                                                         *

   **************************************************************************/



   if (element->next == NULL)

      return -1;



   *data = element->next->data;

   old_element = element->next;

   element->next = element->next->next;



   if (element->next == NULL)

      list->tail = element;



}



/*****************************************************************************

*                                                                            *

*  Free the storage allocated by the abstract data type.                     *

*                                                                            *

*****************************************************************************/



free(old_element);



/*****************************************************************************

*                                                                            *

*  Adjust the size of the list to account for the removed element.           *

*                                                                            *

*****************************************************************************/



list->size--;



return 0;



}

#endif

(2)ex-1.c

/*****************************************************************************
*                                                                            *
*  ex-1.c                                                                    *
*  ======                                                                    *
*                                                                            *
*  Description: Illustrates using a linked list (see Chapter 5).             *
*                                                                            *
*****************************************************************************/

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

#include "list.h"

/*****************************************************************************
*                                                                            *
*  ------------------------------ print_list ------------------------------  *
*                                                                            *
*****************************************************************************/

static void print_list(const List *list) {

ListElmt           *element;

int                *data,
                   i;

/*****************************************************************************
*                                                                            *
*  Display the linked list.                                                  *
*                                                                            *
*****************************************************************************/

fprintf(stdout, "List size is %d\n", list_size(list));

i = 0;
element = list_head(list);

while (1) {

   data = list_data(element);
   fprintf(stdout, "list[%03d]=%03d\n", i, *data);

   i++;

   if (list_is_tail(element))
      break;
   else
      element = list_next(element);

}

return;

}

/*****************************************************************************
*                                                                            *
*  --------------------------------- main ---------------------------------  *
*                                                                            *
*****************************************************************************/

int main(int argc, char **argv) {

List               list;
ListElmt           *element;

int                *data,
                   i;

/*****************************************************************************
*                                                                            *
*  Initialize the linked list.                                               *
*                                                                            *
*****************************************************************************/

list_init(&list, free);

/*****************************************************************************
*                                                                            *
*  Perform some linked list operations.                                      *
*                                                                            *
*****************************************************************************/

element = list_head(&list);

for (i = 10; i > 0; i--) {

   if ((data = (int *)malloc(sizeof(int))) == NULL)
      return 1;

   *data = i;

   if (list_ins_next(&list, NULL, data) != 0)
      return 1;

}

print_list(&list);

element = list_head(&list);

for (i = 0; i < 7; i++)
   element = list_next(element);

data = list_data(element);
fprintf(stdout, "Removing an element after the one containing %03d\n", *data);

if (list_rem_next(&list, element, (void **)&data) != 0)
   return 1;

print_list(&list);

fprintf(stdout, "Inserting 011 at the tail of the list\n");

*data = 11;
if (list_ins_next(&list, list_tail(&list), data) != 0)
   return 1;

print_list(&list);

fprintf(stdout, "Removing an element after the first element\n");

element = list_head(&list);
if (list_rem_next(&list, element, (void **)&data) != 0)
   return 1;

print_list(&list);

fprintf(stdout, "Inserting 012 at the head of the list\n");

*data = 12;
if (list_ins_next(&list, NULL, data) != 0)
   return 1;

print_list(&list);

fprintf(stdout, "Iterating and removing the fourth element\n");

element = list_head(&list);
element = list_next(element);
element = list_next(element);

if (list_rem_next(&list, element, (void **)&data) != 0)
   return 1;

print_list(&list);

fprintf(stdout, "Inserting 013 after the first element\n");

*data = 13;
if (list_ins_next(&list, list_head(&list), data) != 0)
   return 1;

print_list(&list);

i = list_is_head(&list, list_head(&list));
fprintf(stdout, "Testing list_is_head...Value=%d (1=OK)\n", i);
i = list_is_head(&list, list_tail(&list));
fprintf(stdout, "Testing list_is_head...Value=%d (0=OK)\n", i);
i = list_is_tail(list_tail(&list));
fprintf(stdout, "Testing list_is_tail...Value=%d (1=OK)\n", i);
i = list_is_tail(list_head(&list));
fprintf(stdout, "Testing list_is_tail...Value=%d (0=OK)\n", i);

/*****************************************************************************
*                                                                            *
*  Destroy the linked list.                                                  *
*                                                                            *
*****************************************************************************/

fprintf(stdout, "Destroying the list\n");
list_destroy(&list);

return 0;

}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
There are many books on data structures and algorithms, including some with useful libraries of C functions. Mastering Algorithms with C offers you a unique combination of theoretical background and working code. With robust solutions for everyday programming tasks, this book avoids the abstract style of most classic data structures and algorithms texts, but still provides all of the information you need to understand the purpose and use of common programming techniques. Implementations, as well as interesting, real-world examples of each data structure and algorithm, are included. Using both a programming style and a writing style that are exceptionally clean, Kyle Loudon shows you how to use such essential data structures as lists, stacks, queues, sets, trees, heaps, priority queues, and graphs. He explains how to use algorithms for sorting, searching, numerical analysis, data compression, data encryption, common graph problems, and computational geometry. And he describes the relative efficiency of all implementations. The compression and encryption chapters not only give you working code for reasonably efficient solutions, they offer explanations of concepts in an approachable manner for people who never have had the time or expertise to study them in depth. Anyone with a basic understanding of the C language can use this book. In order to provide maintainable and extendible code, an extra level of abstraction (such as pointers to functions) is used in examples where appropriate. Understanding that these techniques may be unfamiliar to some programmers, Loudon explains them clearly in the introductory chapters. Contents include: Pointers Recursion Analysis of algorithms Data structures (lists, stacks, queues, sets, hash tables, trees, heaps, priority queues, graphs) Sorting and searching Numerical methods Data compression Data encryption Graph algorithms Geometric algorithms
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值