数据结构与算法<1>——顺序单链表

首先来实现一个简单的数据结构——顺序单链表。它所实现的功能就是将所插入的所有的数按从小到大的顺序存进一个单链表中。

1.关于单链表

        单链表是一种链式存取的数据结构,用一组地址任意的存储单元存放线性表中的数据元素

其中的每个节点是一个结构体,其中包含两个元素:存储的整数data,指向后一个节点的指针*next。

在本例中,对单链表还有一个指向第一个节点的头指针*Head和指向最后一个节点的尾指针*Tai,这两个指针是用作后面的顺序插入。

2.顺序插入

首先在程序开始运行时将*Head,*Tail赋初值NULL。每当有一个新的数number要插入时,进入以下步骤:

<1>为该整数分配一个节点对应的内存空间,用molloc来实现;

<2>首先判断*Head是否为NULL,也就是判断单链表是否为空,如果是,直接将*Head,*Tail指向新创建的节点,节点的data赋值要插入的整数number;

<3>如果*Head不是NULL,证明单链表已经存在。首先将number与第一个数,也就是头指针指向的结构体里面的数进行比较,如果比它小,则进行头插,则将number插入到最前面,新节点的*next指向之前的第一个节点,然后将*Head指向新节点,然后结束;(头插)

<4>如果number比第一个数大,然后将它与最后一个数比较,如果比最后一个数还要大,则进行尾插,则将number插入到最后面,之前的最后一个节点的*next指向新节点,然后将*Tail指向新节点,然后结束;(尾插)

<5>如果number比第一个大,比最后一个小,则从第一个数开始,逐个取数与number比较,找到合适的地方,然后插入;(中间插入)

<6>显示。从第一个节点开始,逐个输出;


以下为实现的代码:

/*This is a simple-direction linklist */

#include<stdio.h>
#include<stdlib.h>

#define MAXSIZE 30
#define ElemType int


typedef struct Node{
	ElemType data;
	struct Node* next;
}Node;

int ListInsert(
	ElemType number,
	int size_of_linklist,
	struct Node **Head,
	struct Node **Tail,
	struct Node **s)
{
	struct Node *Search = (*Head);
	if ((*Head) == NULL)
	{
		(*Head) = (*s);
		(*Tail) = (*s);
		(*Head)->data = number;
		printf("Head insert success.size is %d\n", size_of_linklist + 1);
		return 1;
	}
	
	else if (((*Tail)->data)<number)
	{
		(*s)->data = number;
		(*Tail)->next = (*s);
		*Tail = *s;
		printf("Tail Insert success.size is %d,Tail is %d.\n", size_of_linklist + 1, (*Tail)->data);
		return 1;
	}
	else if (((*Head)->data)>number)
	{
		(*s)->data = number;
		(*s)->next = (*Head);
		*Head = *s;
		printf("Head Insert success.size is %d\n", size_of_linklist + 1);
		return 1;
	}
	else
	{
		(*s)->data = number;
		while ((Search->data)<number && (Search->next->data)<number)
		{
			Search = Search->next;
		}
		(*s)->next = Search->next;
		Search->next = (*s);
		printf("Mid Insert success.size is %d\n", size_of_linklist + 1);
		return 1;
	}

	return 0;
}

int Show(struct Node **Head, int size_of_linklist)
{
	struct Node *Search = (*Head);
	int i = 0;
	for (i = 0; i<size_of_linklist; i++)
	{
		printf("%d  ", Search->data);
		Search = Search->next;
	}
	printf("\n");
	return 0;
}

int main(){
	int size_of_linklist = 0;
	int choice;
	struct Node *Head = NULL;
	struct Node *Tail = Head;
	struct Node *s;
	while (1)
	{
		printf("1.Insert\n");
		printf("2.Show\n");
		scanf("%d", &choice);
		if (choice == 1)
		{
			int number;
			printf("Please input the number.\n");
			scanf("%d", &number);
			s = (Node *)malloc(sizeof(Node));//new node
			ListInsert(number, size_of_linklist,& Head,& Tail, &s);
			size_of_linklist++;
		}
		else if (choice == 2)
			Show(&Head, size_of_linklist);//display
		else
			printf("error...once again.\n");
			printf("size of list is %d.\n\n\n", size_of_linklist);
	}

	return 0;
}

点赞