数据结构:链表(Linklist)的定义和它的函数们

链表的定义:

对整体的定义(相当于一个大括号,保存一头一尾的指针)

#define MAXSIZE 100

typedef char ElemType;

typedef struct _list

{

ElemType* head;

ElemType* tail;

}List;

对结点的定义

typedef struct _node

{

int index; //链表索引

ELemType data; //节点中的数据

struct _node* next; //链接下一个结点

}Node;

链表初始化:(先弄一个结点)

void InitLinklist(List* plist)

{

plist->head = (Node*)malloc(sizeof(Node)); //链表头指向首结点

if(!plist->head) exit(0); //判断是否成功开辟

plist->tail = plist->head; //链表尾部指向头部

plist->head->next = NULL; //第一个结点的next指向NULL

}

链表结点的添加:

void add(List* plist)

{

static int index = 1; //索引作为静态变量

Node* p = (Node*)malloc(sizeof(Node)); //开辟一个结点

p->index = index++; //记作第index个结点

p->next = NULL;

if(!plist->head) plist->head = p; //如果没有结点,p就作为头结点

else{

Node* pp = plist->head; //用一个指针去找最后一个结点

while(pp->next) pp = pp->next; //直到pp为最后一个结点

pp->next = p; //把最后一个结点的next指向p

plist->tail = p; //链表尾结点更新为p;

}

}

链表的删、查、改等功能:

比较懒,哪天兴致来了再写吧orz

​ BBBBBut!

核心思想不会变:

就是用一个结构体指针去找index或者data(有时候要用另外一个指针记录prev上一个结构体)

其实感觉就是和数组一样:

数组中的删比较麻烦,因为找到之后需要移动一部分的数据,把空位填充;然而链表就不一样了,就和链子一样,中间的断开取下一截,然后把两边连到一起就是了(这可能就是它叫做链表的原因吧,就和链子一样)

查和改都是差不多,用for循环遍历加检测。只是在数组中,我们是用

for(int i = 0 ; i < n ; i++)

然而在链表中,我们就是用

Node* ptr;

for (ptr = list.head ; ptr && ptr->data != key ; ptr = ptr->next );

这时候出来若是NULL则是未找到,否则就找到且ptr指向了那个结点

两者味道其实差不多~