数据结构之链表(头指针链表的插入、删除、逆序)

链表也是一种线性表,区别于顺序表,链表是一种物理上不连续的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。头指针链表指不带头节点的链表,这样的链表在插入时需要考虑空表的情况,指定位置删除插入时也需要考虑是否在第一个节点处。因为头指针链表的很多操作都需要改变头指针。

下面是关于头指针链表的一些操作的实现。(包括头文件与源文件)

头文件:LinkList.h

#ifndef __LINKLIST_H__
#define __LINKLIST_H__
#define TRUE 1
#define FALSE 0

typedef int LinkData;
typedef struct _node
{
	LinkData data;
	struct _node *next;
}LinkList;

//头插法
int	Insert_Head(LinkList **h,LinkData data);

//尾插法
int	Insert_Last(LinkList **h,LinkData data);

//在第Pos个节点处插入,从1开始,没有第0个节点
int	Insert_Pos(LinkList **h,int Pos,LinkData data);

//删除第Pos个节点,从1开始,没有第0个节点
int Delete_Pos(LinkList **h,int Pos);

//逆序链表
int Reverse_List(LinkList **h);

//打印链表
void Display(LinkList *h);

#endif


源文件:LinkList.c

#include 
#include 
#include "LinkList.h"

//头插法
int	Insert_Head(LinkList **h,LinkData data)
{
	if (h == NULL)
	{
		return FALSE;
	}
	LinkList * node = (LinkList *)malloc(sizeof(LinkList)/sizeof(char));
	if (node == NULL)
	{
		return FALSE;
	}
	node -> data = data;
	node -> next = *h;
	*h = node;
	return TRUE;
}

//尾插法
int	Insert_Last(LinkList **h,LinkData data)
{
	if (h == NULL)
	{
		return FALSE;
	}
	LinkList * node = (LinkList *)malloc(sizeof(LinkList)/sizeof(char));
	if (node == NULL)
	{
		return FALSE;
	}
	node -> data = data;
	node -> next = NULL;
	LinkList *tmp = *h;
	if (tmp == NULL)
	{
		*h = node;
	}
	else
	{
		while(tmp -> next)
		{
			tmp = tmp -> next;
		}
		tmp -> next = node;
	}
	return TRUE;
}

//在第Pos个节点处插入,从1开始,没有第0个节点
int	Insert_Pos(LinkList **h,int Pos,LinkData data)
{
	if(h == NULL || Pos < 1)
	{
		printf ("插入失败\n");
		return FALSE;
	}
	LinkList * node = (LinkList *)malloc(sizeof(LinkList)/sizeof(char));
	if (node == NULL)
	{
		return FALSE;
	}
	node -> data = data;
	if (*h == NULL)   //空表
	{
		if (Pos != 1)
		{
			printf ("当前为空表,无法在第%d个节点位置插入\n",Pos);
			free (node);
			return FALSE;
		}
		node -> next = NULL;
		*h = node;
	}
	else
	{
		if (Pos == 1)
		{
			node -> next = *h;
		    *h = node;
		}
		else
		{
			LinkList *tmp = *h;
			int i;
			for (i = 0;i < Pos - 2;i++)
			{
				tmp = tmp -> next;
				if (tmp == NULL)
				{
					printf ("插入越界\n");
					free (node);
					return FALSE;
				}
			}
			node ->next = tmp -> next;
			tmp -> next = node;
		}
	}
	return TRUE;
}

//删除第Pos个节点,从1开始,没有第0个节点
int Delete_Pos(LinkList **h,int Pos)
{
	if (h == NULL || *h == NULL || Pos < 1)
	{
		printf ("删除失败\n");
		return FALSE;
	}
	LinkList *tmp = *h;
	if (Pos == 1)
	{
		*h = (*h) -> next;
		free(tmp);
	}
	else
	{
		LinkList *tmp = *h;
		int i;
		for (i = 0;i < Pos - 2;i++)
		{
			tmp = tmp -> next;
			if (tmp -> next == NULL)
			{
				printf ("删除越界\n");
				return FALSE;
			}
		}
		LinkList *p = tmp -> next;
		tmp -> next = p -> next;;
		free (p);
	}
	return TRUE;
}

//逆序链表
int Reverse_List(LinkList **h)
{
	if (h == NULL || *h == NULL || (*h) -> next == NULL)
	{
		printf ("逆序失败\n");
		return FALSE;
	}
	LinkList *pre = *h;
	LinkList *cur = (*h) -> next;
	LinkList *tmp;
	while(cur)
	{
		tmp = cur -> next;
		cur -> next = pre;
		pre = cur;
		cur = tmp;
	}
	(*h) -> next = NULL;
	(*h) = pre;
	return TRUE;
}

//打印链表
void Display(LinkList *h)
{
	if (h == NULL)
	{
		return;
	}
	int count = 0;
	while(h)
	{
		if(count++ % 4 == 0)
		{
			printf ("\n");
			
		}
		printf ("%8d",h -> data);
		h = h -> next;
	}
	printf ("\n");
}



关于头指针链表的更多的功能,可以大家一起去实现。



你可能感兴趣的:(数据结构,数据结构,内存,存储,指针,链表)