1.可变数组的缺陷
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
linked blocks
No copy
---------------------------------------
2.链表
node.h
#ifndef _NODE_H_
#define _NODE_H_
typedef struct _node {
int value;
struct _node* next;
}Node;
#endif
linkelist.c
#include "node.h"
#include <stdio.h>
#include <stdlib.h>
//typedef struct node {
// int value;
// struct _node* next;
//}Node;
int main(int argc, char const argv[]) {
Node* head = NULL;
int number;
do {
scanf("%d", &number);
if (number != -1) {
//add to linked_list
Node* p = (Node*)malloc(sizeof(Node));
p->value = number;
p->next = NULL;
//find the last
Node* last = head;
if (last) {
while (last->next) {
last = last->next;
}
//attach
last->next = p;
}
else {
head = p;
}
}
} while (number != -1);
return 0;
}
3.链表的函数
#include "node.h"
#include <stdio.h>
#include <stdlib.h>
//typedef struct node {
// int value;
// struct _node* next;
//}Node;
typedef struct _list {
Node* head;
Node* tail;
}List;
void add(List* pList, int number);
int main(int argc, char const argv[]) {
List list;
int number;
list.head = list.tail = NULL;
do {
scanf("%d", &number);
if (number != -1) {
add(&list, number);
}
} while (number != -1);
return 0;
}
void add(List* pList, int number) {
//add to linked_list
Node* p = (Node*)malloc(sizeof(Node));
p->value = number;
p->next = NULL;
//find the last
Node* last = pList->head;
if (last) {
while (last->next) {
last = last->next;
}
//attach
last->next = p;
}
else {
pList->head = p;
}
}
List中加入tail后可以优化函数
void add(List* pList, int number) {
//add to linked_list
Node* p = (Node*)malloc(sizeof(Node));
p->value = number;
p->next = NULL;
if (pList->head == NULL) {
pList->head = p;
pList->tail = p;
}
else {
pList->tail->next = p;
pList->tail =p;
}
4.链表的搜索
遍历打印链表
void print(List* pList) {
Node* p;
for (p = pList->head; p; p = p->next) {
printf("%d\t", p->value);
}
printf("\n");
}
How do we find the boundary?
for(q=0,p=head;p;q=p,p=p->next){
if(p->value==i){
q->next=p->next;
}
Any pointer at the left of -> must be checked
5.链表的删除
Node* q;
for (q = NULL, p = list.head; p; q = p, p = p->next) {
if (p->value == number) {
if (q) {
q->next = p->next;
}
else {
list.head = p->next;
}
}
free(p);
break;
}
6.链表的清除
for (p = list.head; p; p = q) {
q = p->next;
free(p);
}
node.h
#ifndef _NODE_H_
#define _NODE_H_
typedef struct node {
int value;
struct _node* next;
}Node;#endif
node.c
#include "node.h"
#include <stdio.h>
#include <stdlib.h>
//typedef struct node {
// int value;
// struct _node* next;
//}Node;
typedef struct _list {
Node* head;
Node* tail;
}List;
void add(List* pList, int number);
void print(List* pList);
int main(int argc, char const argv[]) {
List list;
int number;
list.head = list.tail = NULL;
do {
scanf("%d", &number);
if (number != -1) {
add(&list, number);
}
} while (number != -1);
print(&list);
scanf("%d", &number);
Node* p;
int isFound = 0;
for (p = list.head; p; p = p->next) {
if (p->value == number) {
printf("找到了\n");
isFound = 1;
break;
}
}
if (!isFound) {
printf("该链表中没有要找的数据。\n");
}
Node* q;
for (q = NULL, p = list.head; p; q = p, p = p->next) {
if (p->value == number) {
if (q) {
q->next = p->next;
}
else {
list.head = p->next;
}
}
free(p);
break;
}
for (p = list.head; p; p = q) {
q = p->next;
free(p);
}
return 0;
}
void add(List* pList, int number) {
//add to linked_list
Node* p = (Node*)malloc(sizeof(Node));
p->value = number;
p->next = NULL;
if (pList->head == NULL) {
pList->head = p;
pList->tail = p;
}
else {
pList->tail->next = p;
pList->tail =p;
}
}
void print(List* pList) {
Node* p;
for (p = pList->head; p; p = p->next) {
printf("%d\t", p->value);
}
printf("\n");
}