数据结构:链表(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指向了那个结点
两者味道其实差不多~