单链表代码实现

如题;这是一套完整的可运行的代码;需要读者有一定的基础去阅读;

语言是用C语言实现;在C++环境中编写;在C++中可直接运行;在C语言中需要改部分头文件和输出语句;

头文件;这要是代码的声明部分;

# ifndef _LINKLIST_
# define _LINKLIST_

# include <iostream>
using namespace std;

typedef int DataType;

typedef struct Node
{
	DataType data;
	struct Node * next;
}LNode, * LinkList;

LinkList Create_LinkList(void);
void Destroy_LinkList(LinkList * pH);
int Length_LinkList(LinkList H);
void Inversion_LinkList(LinkList * pH);
void Traversal_LinkList(LinkList H);
LinkList Search_LinkList_Pos(LinkList H, int i);
LinkList Search_LinkList_value(LinkList H, DataType x);
int Insert_LinkList_Pos(LinkList H, int i, DataType x);
int Push_LinkList(LinkList H, DataType x);
int Delete_LinkList_Pos(LinkList H, int i, int * val);
int Pop_LinkList(LinkList H, int * val);
void Sort_LinkList(LinkList H);

# endif

实现文件;

# include "LinkList.h"

LinkList Create_LinkList(void)
{
	LinkList H = (LinkList)malloc(sizeof(LNode));

	if (NULL != H)
	{
		H->next = NULL;
		H->data = 0;

		return H;
	}
	else
	{
		cout << "LinkList Create_LinkList(void): Memory allocate error! " << endl;
		system("pause");
		exit(0);
	}
}

void Destroy_LinkList(LinkList * pH)
{
	LinkList p = *pH;
	LinkList q = NULL;

	while (p)
	{
		q = p;
		p = p->next;
		free(q);
		q = NULL;
	}
	*pH = NULL;

	return;
}

int Length_LinkList(LinkList H)
{
	LinkList p = H;
	int cnt = 0;

	while (p->next)
	{
		p = p->next;
		cnt++;
	}

	return cnt;
}

void Inversion_LinkList(LinkList * pH)
{
	int val = 0;
	LinkList p = *pH;
	LinkList q = Create_LinkList();
	
	int len = Length_LinkList(p);

	for (int i = 0; i < len; i++)
	{
		Pop_LinkList(p, &val);
		Push_LinkList(q, val);
	}

	*pH = q;

	return;
}

void Traversal_LinkList(LinkList H)
{
	LinkList p = H;

	while (p->next)
	{
		p = p->next;

		cout << p->data << " ";
	}
	cout << endl;

	return;
}

//这是链表操作最重要的操作,后面的插入删除都要用到查找;
//这里能避免三种异常情况;
//1、当传进来的链表不存在时,直接返回NULL;
//2、当传入要查找的序号大于链表的最大个数时, while-loop直到p == NULL;退出;
//3、当传入的序号小于0时, 由于j > i 退出;
//三种请况有一种是极端的链表不存在;其他两种本质都是序号不存在引起的;
//一个大于的链表元素个数;一个小于0, 当序号等于0时,返回头指针变量;
//理解这个程序应该反向理解, 只有当数据传递正确是才能正确返回结果;否则要么是序号错误要么链表不存在;
LinkList Search_LinkList_Pos(LinkList H, int i)
{
	LinkList p = H;
	int j = 0;

	while ((NULL != p) && (j < i))
	{
		p = p->next;
		j++;
	}

	if ((NULL == p) || (j > i))//NULL == p是由于链表为空或在序号大于链表最大个数;j > i 是由于序号小于0;
	{
		cout << "LinkList Search_LinkList_Pos(LinkList H, int i) : Forward list is not exit or Parameter is error! " << endl;
		return NULL;
	}

	return p;
}

LinkList Search_LinkList_value(LinkList H, DataType x)
{
	LinkList p = H->next;
	while ((NULL != p) && (p->data != x))
	{
		p = p->next;
	}

	return p;
}

int Insert_LinkList_Pos(LinkList H, int i, DataType x)
{
	LinkList p = Search_LinkList_Pos(H, i - 1);
	if (NULL == p)
	{
		return -1;
	}

	LinkList q = (LinkList)malloc(sizeof(LNode));
	if (NULL == q)
	{
		return -2;
	}
	q->data = x;
	q->next = NULL;

	q->next = p->next;
	p->next = q;

	return 0;
}

int Push_LinkList(LinkList H, DataType x)
{
	LinkList p = H;

	while (p->next)
	{
		p = p->next;
	}

	LinkList q = (LinkList)malloc(sizeof(LNode));
	if (NULL == q)
	{
		return -1;
	}
	q->data = x;
	q->next = NULL;

	p->next = q;

	return 0;
}

int Delete_LinkList_Pos(LinkList H, int i, int * val)
{
	//没有这个if判断也可以;但是这要提前判断可以提高效率;判断表不存在主要是呼应Insert()可以处理表不存在;
	if (NULL == H || NULL == H->next)
	{
		return -1;
	}

	LinkList p = Search_LinkList_Pos(H, i - 1);
	if (NULL == p || NULL == p->next)//判断p->next == NULL主要是删除的不能是最后一个元素的下一个元素;
	{
		return -2;
	}

	LinkList q = p->next;
	p->next = q->next;

	*val = q->data;

	free(q);
	q = NULL;

	return 0;
}

int Pop_LinkList(LinkList H, int * val)
{
	if (NULL == H->next)
	{
		return -1;
	}

	LinkList p = H;
	while (p->next->next)
	{
		p = p->next;
	}

	LinkList q = p->next;
	p->next = NULL;

	*val = q->data;

	free(q);
	q = NULL;

	return 0;
}

void Sort_LinkList(LinkList H)
{
	LinkList p = H->next;
	int len = Length_LinkList(H);
	if (len < 0)
	{
		return;
	}

	for (int i = 0; i < len - 1; i++)
	{
		for (int j = 0; j < len - 1 - i; j++)
		{
			if (p->data > p->next->data)
			{
				int tem = p->data;
				p->data = p->next->data;
				p->next->data = tem;
			}

			p = p->next;
		}

		p = H->next;
	}

	return;
}

Main函数;

# include "LinkList.h"

int main(int argc, char ** argv)
{
	int val = 0;
	LinkList H = Create_LinkList();

	Push_LinkList(H, 3);
	Push_LinkList(H, 8);
	Push_LinkList(H, 2);
	Push_LinkList(H, 20);
	Push_LinkList(H, 38);
	Push_LinkList(H, 16);
	Push_LinkList(H, 25);
	Push_LinkList(H, 33);
	Push_LinkList(H, 120);
	Push_LinkList(H, 60);

	Traversal_LinkList(H);

	Inversion_LinkList(&H);;

	Traversal_LinkList(H);

	system("pause");
	return 0;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值