#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;
}