版权声明:本文为博主原创文章,未经博主允许不得转载。如有错误,欢迎指出~(@^_^@)~ https://blog.csdn.net/zwj1452267376/article/details/82229276
单向链表
在上一回可变数组的文末阐述了可变数组的缺点。链表针对同一需求就很好的弥补了可变数组的缺点。其结构如下图:
在单链表分为头部*head
指针,和后续节点两个部分。在每个节点中也有两个部分,分别用于是存放数值(图中value
的部分),及指向下一个节点的next
指针。head
指针刚开始为空,在添入第一个节点后,指向第一个节点。当节点的next
指向NULL时,表示该节点当前没有后继节点。
构造单向链表
使用结构体表示链表的单个节点
typedef struct _node{
int value;
struct _node *next;
} Node;
构造链表
typedef struct _list {
Node *head;
} List;
实现单向链表
实现的功能包括:添加元素、打印所有元素、查询元素、删除元素、清空链表。
可执行代码如下:
#include <stdio.h>
#include <stdlib.h>
typedef struct _node{
int value;
struct _node *next;
} Node;
typedef struct _list {
Node *head;
} List;
void add(List *pList, int number)//添加
{
// add to linked-list
Node *p = (Node*)malloc(sizeof(Node));
p->value = number;
p->next = NULL;
// find the last
Node *last = pList->head;
if(last)
{
while(last->next)
last = last->next;
// attach
last->next = p;
}
else
pList->head = p;
}
void print(List *pList)//打印链表所有元素
{
Node *p;
for (p=pList->head; p; p=p->next)
printf("%d\t", p->value);
printf("\n");
}
int found(List *pList, int number)//查询元素是否在链表内
{
Node *p;
int isFound = 0;
for(p=pList->head; p; p=p->next)
{
if(p->value == number)
{
printf("is found\n");
isFound = 1;
break;
}
}
if(!isFound)
{
printf("NO found\n");
return 0;
}
else
return 1;
}
void Remove(List *pList, int number)//删除元素
{
Node *p, *q;
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 empty(List *pList)//清空链表
{
Node *p, *q;
for (p=pList->head; p; p=q)
{
q = p->next;
free(p);
}
pList->head = NULL;
}
int main(int argc, char const *argv[])
{
List list;
int number;
list.head = NULL;
//向链表中添加元素,直到输入-1结束
do {
scanf("%d",&number);
if(number != -1)
add(&list, number);
} while(number != -1);
print(&list);
//输入一个数,查询这个数是否在链表中,是则删除这个数。 直到输入-1结束
while(1)
{
scanf("%d", &number);
if(number != -1)
{
if(found(&list, number))
Remove(&list, number);
print(&list);
}
else break;
}
empty(&list);
//验证链表是否被清空
if(list.head == NULL)
printf("list was emptied!\n");
return 0;
}