数据结构基础篇-------2. 单链表的创建及运算

/*
 * 单链表的创建及其运算
 * 2018.10.23
 * @L.F
 *
 * */

#include
#include
#include
typedef int DataType_t;//结点的数据类型为DataType_t,这里是Int型

typedef struct Node    //结点类型的定义
{
	DataType_t Data;   //结点的数据域类型
	struct Node *Next; //结点的指针域类型
}LinkList;

LinkList *LinkListCreate() //创建一个空的链表
{
	LinkList *h = (LinkList *)malloc(sizeof(LinkList)); //创建一个头结点
	h->Next = NULL; //初始化结构体
	return h;
}

void LinkListInsertHead(LinkList *h, DataType_t Value)//头插法插入数据
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));//申请空间并赋值
	Temp->Data = Value;
	Temp->Next = h->Next;//将头结点的下一个结点的地址保存在新插入结点的指针域里面
	h->Next = Temp;//将新插入的结点的地址保存在头结点的指针域里面
	return ;
}

void LinkListInsertTail(LinkList *h, DataType_t Value)//尾插法插入数据
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));//申请空间并赋值
	Temp->Data = Value;
	while(h->Next != NULL)//找到最后一个结点
	{
		h = h->Next;
	}
	Temp->Next = NULL;
	h->Next = Temp;
	return ;
}

void LinkListInsertPos(LinkList *h, int pos, DataType_t Value)//按照位置插入数据
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));
	Temp->Data = Value;
	int i =1;
	while(h->Next != NULL && i<= pos)
	{
		h = h->Next;
		i++;
	}
	if(h->Next == NULL)
	{
		printf("位置出错\n");
	}
	else
	{
		Temp->Next = h->Next;
		h->Next = Temp;
	}
	return ;
}

void LinkListInsertSort(LinkList *h, DataType_t Value)//按照顺序插入(自带排序功能)
{
	LinkList *Temp = (LinkList *)malloc(sizeof(LinkList));
	Temp->Data = Value;
	while(h->Next != NULL && h->Next->Data < Temp->Data)
	{
		h = h->Next;
	}
	Temp->Next = h->Next;
	h->Next = Temp;
	return ;
}

DataType_t LinkListDeleteHead(LinkList *h)//头删法删除数据
{
	/*h->Next = h->Next->Next;//只删除*/
	/*
	 * DataType_t Value;
	 * Value = h->Next->Data;
	 * h->Next = h->Next->Next;
	 * */
	/*释放删除结点*/
	DataType_t Value;
	LinkList *Temp = h->Next;
	Value = h->Next->Data;
	h->Next = h->Next->Next;
	free(Temp);
	Temp = NULL;
	return Value;
}

int LinkListUpdata(LinkList *h, DataType_t OldValue, DataType_t NewValue)//按照数据修改数据
{
	while(h->Next != NULL)
	{
		if(h->Next->Data == OldValue)
		{
			h->Next->Data = NewValue;
			return 0;
		}
		h = h->Next;
	}
	printf("%d 是不存在的", NewValue);
	return -1;
}

int LinkListSearch(LinkList *h,DataType_t Value)//按照数据查找位置
{
	int pos = 0;
	while(h->Next != NULL)
	{
		if(h->Next->Data == Value)
		{
			return pos;
		}
		h = h->Next;
		pos++;
	}
	printf("%d 不存在\n", Value);
	return -1;
}

void LinkListReverse(LinkList *h)//实现链表的翻转
{
	LinkList *p = h->Next;
	LinkList *q;
	h->Next = NULL;
	while(p != NULL)
	{
		q = p;
		p = p->Next;
		q->Next = h->Next;
		h->Next = q;
	}
	return ;
}

void LinkListShow(LinkList *h)//打印数据
{
	while(h->Next != NULL)
	{
		h = h->Next;
		printf("             %d", h->Data);
	}
	putchar(10);
}
int main(int argc, const char *argv[])
{
	LinkList *h = LinkListCreate();
	int F,s,i,a,n;
	while(1)
	{
	printf("请输入您的需求:      1.头插法插入数据        2.尾插法插入数据        3.按照位置插入数据\n");
	printf("                      4.按照顺序插入数据      5.头删法删除数据        6.按照数据修改数据\n");
	printf("                      7.按照数据查找位置      8.实现链表的翻转\n");
	scanf("%d", &F);
		switch(F)
		{
		case 1:
			printf("请输入您要插入的数据个数:");
			scanf("%d",&s);
			for(i=0; i

 

你可能感兴趣的:(数据结构基础篇-------2. 单链表的创建及运算)