网易云课堂_C语言程序设计进阶_第5周:链表

5.1可变数组

5.2链表

5.1可变数组

Resizable Array

Think about a set of functions that provide a mechanism of resizable array of int.

Growable

Get the current size

Access to the elements

The Interface

Array array_create(int init_size);

void array_free(Array *a);

int array_size(const Array *a);

int *array_at(Array *a, int index);

void array_inflate(Array *a, int more_size);

头文件array.h

 1 #include <stdio.h>
 2 
 3 #ifndef _ARRAY_H_
 4 #define _ARRAY_H_
 5 
 6 typedef struct
 7 {
 8     int *array;
 9     int size;
10 }Array;
11 
12 Array array_create(int init_size);//清空数组
13 void array_free(Array *a);//返回数组元素数量
14 int array_size(const Array *a);//返回数组某个下标的值
15 int *array_at(Array *a, int index);//返回数组某个下标的值
16 int array_get(const Array *a, int index);//返回数组某个下标的值
17 void array_set(Array *a, int index, int value);//修改数组某个下标的值
18 void array_inflate(Array *a, int more_size);//增大数组
19 
20 #endif

源文件array.c

 1 #include "array.h"
 2 
 3 const BLOCK_SIZE = 20;
 4 
 5 //typedef struct
 6 //{
 7 //    int *array;
 8 //    int size;
 9 //}Array;
10 
11 Array array_create(int init_size)//创建数组
12 {
13     Array a;
14     a.size = init_size;
15     a.array = (int *)malloc(sizeof(int)*a.size);
16     return a;
17 }
18 
19 void array_free(Array *a)//清空数组
20 {
21     free(a->array);
22     a->array = NULL;
23     a->size = 0;
24 }
25 
26 int array_size(const Array *a)//返回数组元素数量
27 {
28     return a->size;
29 }
30 
31 int *array_at(Array *a, int index)//返回数组某个下标的值
32 {
33     if (index >= a->size)
34     {
35         array_inflate(a, (index / BLOCK_SIZE + 1)*BLOCK_SIZE - a->size);
36     }
37     return &(a->array[index]);
38 }
39 
40 int array_get(const Array *a, int index)//返回数组某个下标的值
41 {
42     return a->array[index];
43 }
44 
45 void array_set(Array *a, int index, int value)//修改数组某个下标的值
46 {
47     a->array[index] = value;
48 }
49 
50 void array_inflate(Array *a, int more_size)//增大数组
51 {
52     int *p = (int *)malloc(sizeof(int)*(a->size + more_size));
53     int i;
54     for (i = 0; i < a->size; i++)
55     {
56         p[i] = a->array[i];
57     }
58     free(a->array);
59     a->size += more_size;
60 }
61 
62 void main()
63 {
64     Array a = array_create(100);
65     printf("%d
", array_size(&a));
66     *array_at(&a, 0) = 10;
67     printf("%d
", *array_at(&a, 0));
68 
69     int number;
70     int cnt = 0;
71     while (1)
72     {
73         /*scanf("%d", &number);
74         *array_at(&a, cnt++) = number;*/
75         scanf("%d", array_at(&a, cnt++));
76     }
77     
78     array_free(&a);
79 
80     system("pause");
81 }

5.2链表

issues

Allocate new memory each time it inflates is an easy and clean way. BUT

It takes time to copy, and

may fail in memory restricted situation

必须保证:->箭头左边的指针,不能为空

1     for (q = 0, p = head; p; q = p, p = p->next)
2     {
3         if (p->value == 1)
4         {
5             q->next = p->next;
6         }
7     }

 

image 

必须保证:->箭头左边的指针,不能为空

原文地址:https://www.cnblogs.com/denggelin/p/5617974.html