C语言实现数据结构:零点五.单向链表(热身篇)

单向链表

在上一回可变数组的文末阐述了可变数组的缺点。链表针对同一需求就很好的弥补了可变数组的缺点。其结构如下图:
单链表结构图

在单链表分为头部*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;
}
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页