继上次的链表一,已经熟悉了链表大致的结构,这篇则是讲基本链表的最终形态
首先来确定一下需要学习链表的哪些东西:添加、打印、寻找、删除和清除
- void add(List* pList, int number);//添加结点
- void print(List* list);//打印链表
- void seek(List* list, int number);//寻找链表中的某个值
- void del(List* list, int number);//删除结点
- void clear(List* list);//清除链表
上一篇中,添加结点时候都是从头指针(head)开始,这使得工作效率很低,这次我们想引入一个指针,使它每次都指向链表的最后一个结点
typedef struct _list{
Node* head;
Node* tail;
}List;
所以在逻辑上也需要变化
void add(List* pList, int number)
{
Node* p = (Node*)malloc(sizeof(Node));
p->value = number;
p->next = NULL;
Node* last = plist->tail;
if (last)
{
last->next = p;
plist->tail = p;//使它永远指向新加入的那个结点
}
else
{
plist->head = p;
plist->tail = p;//使它永远指向新加入的那个结点
}
}
接下来是打印,与上次一样,只不过head在list里了
void print(List* list)
{
Node* p;
for (p = list->head; p; p = p->next)
{
printf("%d\t", p->value);
}
printf("\n");
}
在上次这段代码中,输出时候会弹窗,但是变成函数之后并没有这种情况
void seek(List* list, int number)
{
Node* p;
int isFound = 0;
for (p = list->head; p; p = p->next)
{
if (p->value == number)
{
printf("找到了!\n");
isFound = 1;
break;
}
}
if (isFound == 0)
{
printf("没找到!\n");
}
}
删除的话也没什么变化
void del(List* list, int number)
{
Node* p;
Node* q = NULL;
for (q, p = list->head; p; q = p, p = p->next)
{
if (p->value == number)
{
if (q)
{
q->next = p->next;
}
else
{
list->head = p->next;
}
free(p);
break;
}
}
}
最后是清除
void clear(List* list)
{
Node* p;
Node* q;
for (p = list->head; p; p = q)
{
q = p->next;
free(p);
}
printf("清除完毕!");
}
标签:Node,List,void,list,number,链表 From: https://www.cnblogs.com/Iguang/p/16704734.html到这基本链表就结束了,有机会会更新数据结构的内容