说来惭愧,大学有数据结构课程,然而当时根本没学懂什么东西,出来混迟早是要还的。
链表: 数组在内存中是连续存放的,而链表在内存中布局是不规则的,每个节点都可以通过指针找到后继,最后一个节点的指针域为NULL。 以下是单向链表图和实现
代码:
link.h
#ifndef LINK_H
#define LINK_H
#define LEN sizeof(Link)
struct Node;
typedef struct Node * Link;
typedef int Type;
struct Node{
Type E;
Link Next;
};
Link MakeNode(Type E);
void Lpush(Link L);
void RPush(Link L);
void Insert();
Link Pop();
void MakeEmpty();
Link Search();
void PrintLink();
#endif
link.c
#include <stdio.h>
#include <stdlib.h>
#include "link.h"
static Link Head = NULL;
//生成节点
Link MakeNode(Type E){
Link P = malloc(LEN);
P->E = E;
P->Next = NULL;
return P;
}
//在链表左侧插入元素
void LPush(Link L){
L->Next = Head;
Head = L;
}
//在链表右侧插入元素
void RPush(Link L){
if(Head == NULL){
Head = L;
}else{
Link P = Head;
while(P->Next != NULL){
P = P->Next;
}
P->Next = L;
}
}
//在指定元素位置后插入
void Insert(Link L ,Type E){
if(Head == NULL || Head->Next == NULL){//不足2个元素
printf("InsertError:link length less than 2");
return;
}
Link P = Search(E);
if(P == NULL){//找不到指定元素
printf("Insert Error:can't find element %d in link", E);
return;
}
L->Next = P->Next;
P->Next = L;
}
Link Pop(){
if(Head == NULL){
return NULL;
}
Link P = Head;
Head = Head->Next;
return P;
}
void MakeEmpty(){
if(Head == NULL){
return;
}
Link P, Tmp;
P = Head;
Head = NULL;
while(P != NULL){
Tmp = P;
P = P->Next;
free(Tmp);
}
}
Link Search(Type E){
Link P = Head;
if(P == NULL){
return NULL;
}
while(P != NULL){
if(P->E == E){
return P;
}
P = P->Next;
}
return NULL;
}
void PrintLink(){
Link P = Head;
if(P == NULL){
printf("empty Link\n");
return;
}
while(P != NULL){
printf("%d ", P->E);
P = P->Next;
}
printf("\n");
}
int main(int argc, char *argv[]){
int i;
Link P;
for(i = 1; i <= 10; i++){
P = MakeNode(i);
RPush(P);
}
PrintLink();
Pop();
Pop();
PrintLink();
return 0;
}