一、链表 (linked list)
1.1 创建头文件
node —— 节点
//node.h
#ifndef _NODE_H_
#define _NODE_H_
typedef struct _node{
int value; //此单元的值
struct _node * next; //下一个单元的首地址
} Node;
#endif
1.2 程序举例:创建链表
#include <stdio.h>
#include <stdlib.h>
#include "node.h"
typedef struct _list{ //存储链表的头和尾
Node* head;
Node* tail;
} List;
void add( Node* head, int number);
int main(){
List list;
list.head = list.tail = NULL;
int number;
while( (scanf("%d", &number)) != EOF ){
add(&list, number);
}
return 0;
}
二、链表的函数
//参数为原链表的头和尾,以及待存储的数值
void add( List* pList, int number)
{
//创建新单元
Node* p = (Node*)malloc(sizeof(Node));
p->value = number;
p->next = NULL; //最后一个结构单元的指针成员为空
//判断pList此时是否指向NULL
if(pList){
pList->tail = p;
}
else{
pList->head = p;
}
}
三、链表的搜索
3.1 链表的遍历
//链表的遍历
Node *p;
for(p = list.head; p; p = p->next){
printf("%d\t", p->value);
}
printf("\n");
//链表遍历函数
void print(List* pList){
Node *p;
for(p = pList->head; p; p = p->next){
printf("%d\t", p->value);
}
printf("\n");
}
3.2 链表元素的搜索
//搜索链表中是否有某个数
int number, isFound = 0;
scanf("%d", &number);
Node *p;
for( p=list.head; p; p = p->next){
if(p->value == number){
printf("找打了!\n");
isFound = 1;
break;
}
}
if(!isFound) printf("没找到。\n");
//函数形式
void search(List* pList, int number)
{
int isFound = 0;
Node *p;
for( p=pList->head; p; p = p->next){
if(p->value == number){
printf("找到了!\n");
isFound = 1;
break;
}
}
if(!isFound) printf("没找到。\n");
}
四、链表单元的删除
//删除链表中的某个单元
void delete(List* pList, int number)
{
Node *p, *q; //记录所在单元p,和p的上一个单元
for(q=NULL, p=pList->head; p; q=p, p=p->next){
//链接目标单元相邻的两个单元(跳过目标单元)
if(p->value == number){
if( q ){
q->next = p->next;
}
else{
pList->head = p->next;
}
free(p); //释放目标单元内存空间
break
}
}
}
在使用指向链表单元的指针时,需要先考虑该指针是否为空指针。
五、链表的清除
void flush(List* pList)
{
Node*p, *q;
for(p=pList->head; p; p=q){
q = p->next;
free(p);
}
}