C语言单链表操作

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

typedef int ElemType;
typedef struct Lnode {
	ElemType data;
	struct Lnode* next;
}LNode, * LinkList;

/*
	单链表的初始化
*/
void InitList_L(LinkList& L) {
	L = (LinkList)malloc(sizeof(LNode));
	if (!L)exit(-1);
	L->next = NULL;
}

/*
	判断链表是否为空
*/
bool ListEmpty(LinkList L) {
	if (L->next)
	{
		return true;
	}
	else {
		return false;
	}
}

/*
	销毁单链表
	包括头节点内存空间全部释放
*/
int DestroyList_L(LinkList& L) {
	LinkList p;
	//依次释放所有结点
	while (L) {
		p = L;
		L = L->next;
		free(p);		
	}
	return 1;
}

/*
	清空单链表
	释放除头节点之外所有节点的内存空间
*/
int ClearList_L(LinkList& L) {
	LinkList p, q;
	p = L->next;
	while (p)
	{
		q = p->next;
		free(p);
		p = q;

	}
	L->next = NULL;
	return 1;
}

/*
	求单链表的表长
*/
int ListLength(LinkList L) {
	int i = 0;
	LinkList p = L->next;
	while (p) {
		i++;
		p = p->next;
	}
	return i;
}

/*
	取值---取单链表中第i个元素的内容返回第i个元素地址
*/
LinkList GetElem_L(LinkList L, int i) {
	int j = 1;
	LinkList p;
	p = L->next;
	if (i == 0)  //若i=0返回头结点
	{
		return L;
	}
	if (i < 1)
	{
		return NULL;//若i无效返回NULL
	}
	while (p && j < i)//从第一个结点开始查找,查找第i个结点
	{
		p = p->next;
		j++;
	}
	return p;
}

/*
	按值查找---根据指定数据获取数据所在位置(地址)
*/
LinkList LocateElem_L(LinkList L, ElemType e) {
	LinkList p;
	p = L->next;
	while (p && p->data != e)
	{
		p = p->next;
	}
	return p;
}

/*
	查找:按值查找:根据指定数据获取数据所在位置(序号)
*/
int LocateElem_L2(LinkList L, ElemType e) {
	int j = 1;
	LinkList p = L->next;
	while (p && p->data != e)
	{
		p = p->next;
		j++;
	}
	if (p)
	{
		return j;
	}
	else
	{
		return 0;
	}
}

/*
	插入:在第i个结点前插入新结点
*/
int ListInsert_L(LinkList& L, int i, ElemType e) {
	//查找第i - 1个结点的地址
	LinkList p = GetElem_L(L, i - 1);
	LinkList s = (LinkList)malloc(sizeof(LNode));
	if (!s)exit(-1);
	s->data = e;
	s->next = p->next;
	p->next = s;
	return 1;
}

/*
	删除第i个结点
*/
int ListDelete_L(LinkList& L, int i, ElemType& e) {
	//查找要删除结点的前一个结点
	LinkList p =  GetElem_L(L, i - 1);
	LinkList q = p->next;
	e = q->data;
	p->next = q->next;
	free(q);
	return 1;
}

/*
	单链表的建立:头插法
*/
int CreateList_H(LinkList& L) {
	printf("输入要插入的数据(输入9999结束运行):
");
	int val;
	scanf_s("%d", &val);
	while (val != 9999)
	{
		LinkList p = (LinkList)malloc(sizeof(LNode));
		if (!p)exit(-1);
		p->data = val;
		p->next = L->next;
		L->next = p;
		printf("输入要插入的数据(输入9999结束运行):
");
		scanf_s("%d", &val);
	}
	return 1;
}

/*
	单链表的建立:尾插法
*/
int CreateList_R(LinkList& L) {
	printf("输入要插入的数据(输入9999结束运行):
");
	int val;
	LinkList r = L;
	LinkList p;
	scanf_s("%d", &val);
	while (val != 9999)
	{
		p = (LinkList)malloc(sizeof(LNode));
		if (!p)exit(-1);
		p->data = val;
		p->next = NULL;
		r->next = p;
		r = p;
		printf("输入要插入的数据(输入9999结束运行):
");
		scanf_s("%d", &val);
	}
	return 1;
}

/*
	遍历单链表
*/
void List_traverse(LinkList L) {
	LinkList p = L->next;
	while (p)
	{
		printf("%d ", p->data);
		p = p->next;
	}
}
int main() {
	LinkList L;
	ElemType e;
	InitList_L(L);
	//CreateList_H(L);//头插法
	CreateList_R(L);//尾插法
	//ClearList_L(L);//清空单链表
	//printf("%d", ListLength(L));//求单链表的表长
	//printf("%d", LocateElem_L2(L, 3));//查找:按值查找:根据指定数据获取数据所在位置(序号)
	//ListInsert_L(L, 3, 111);//插入:在第i个结点前插入新结点
	ListDelete_L(L, 3, e);//删除第i个结点
	List_traverse(L);
	return 0;
}
我亦无他,惟手熟尔
原文地址:https://www.cnblogs.com/AsuraPlus/p/15413056.html