1.可变数组的缺陷
问题:当长度不够时 申请新的内存是一个简洁的方式,但是 拷贝数据耗时,在内存限制下 可能会拷贝失败(比如内存剩下4字节,原数组4字节,新的数据2字节。如果重新申请一段内存做拷贝就会失败)
解决:我们希望把各数组连接起来,不是拷贝
链表中每个元素 需要知道 值 和 下一个元素的地址,我们知道 链表的 头 head,就可以获取链表中的元素
2.定义链表
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>
int main(int argc, const char *argv){
Node *head = NULL;
int number;
// 假设结束标志是 -1
do{
scanf("%d", &number);
if(number != -1){
//add to link-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);
printf("------------\n");
return 0;
}
3.链表的基本操作
node.h
#ifndef _NODE_H_
#define _NODE_H_
typedef struct _node{
int value;
struct _node *next;
} Node;
typedef struct _list{
Node* head;
} List;
Node* add(List* pList, int value);
void print(List *pList);
int isFound(List *pList, int value);
void deleteNode(List *pList, int value);
void clearList(List *pList);
#endif
node.c
#include "node.h"
#include <stdio.h>
#include <stdlib.h>
Node* add(List* pList, int value){
Node *p = (Node*)malloc(sizeof(Node));
p->value = value;
p->next = NULL;
// find the last Node in Linked-list
Node *last = pList->head;
if(last){
while(last->next){
last = last->next;
}
// attatch to last
last->next = p;
} else{
pList->head = p;
}
return pList->head;
}
void print(List *pList){
Node *p;
for(p = pList->head; p; p = p->next){
printf("%d\t", p->value);
}
printf("\n");
}
int isFound(List *pList, int value){
Node *p;
int isFound = 0;
for(p = pList->head; p; p = p->next){
if(p->value == value){
isFound = 1;
break;
}
}
if(isFound){
printf("找到了\n");
} else{
printf("没找到\n");
}
return isFound;
}
// 删除链表中第一个等于 value的 node
void deleteNode(List *pList, int value){
Node *current;
Node *before;
for(before = NULL, current = pList->head; current; before = current, current = current->next){
if(current->value == value){
if(before){
before->next = current->next;
} else {
pList->head = current->next;
}
free(current);
break;
}
}
}
void clearList(List *pList){
Node *current;
Node *after;
for(current = pList->head, after = current; current; current = after){
after = current->next;
free(current);
}
}
int main(int argc, const char *argv){
List list;
list.head = NULL;
int number;
do{
scanf("%d", &number); // 输入 1 2 -1
list.head = add(&list, number);
}while(number != -1);
print(&list); // 输出 1 2 -1
int found = isFound(&list, 3); // 没找到
deleteNode(&list, 2);
print(&list); // 输出 1 -1
clearList(&list);
printf("----");
return 0;
}