1.单链表的存储结构
typedef int ElemType;// 定义数据类型,可根据需要进行其他类型定义
typedef struct Node {
ElemType data;// 数据域,存放数据
struct node *next;// 指向下一个链表节点
}ListNode, * LinkList;
2.单链表的初始化
void InitList(LinkList* L)
{
if ((*L = (LinkList)malloc(sizeof(ListNode))) == NULL)//为头结点分配一个储存空间
{
exit(-1);
}
(*L)->next = NULL;//将单链表的头结点指针域为空
}
3.判断单链表是否为空
int ListEmpty(LinkList L)
{
if (L->next == NULL) //如果链表为空
{
return 1; //返回1
}
else
{
return 0; //返回0
}
}
4.按序号查找
//查找单链表中的第i个结点。查找成功返回该结点的指针,否则返回NULL
ListNode* Get(LinkList L, int i)
{
ListNode* p;
int j;
if (ListEmpty(L))//判断传的值是否为空
return NULL;
if (i < 1) //判断要插入的结点位置是否存在
return NULL;
j = 0;
p = L;
while (p->next != NULL && j < i)//通过循环找到要找的第i个结点
{
p = p->next;
j++;
}
if (j == i)
return p;//返回指针p
else
return NULL;
}
5.按内容查找
//查找单链表中元素值为e的元素,查找成功则返回对应元素的指针,否则返回Null
ListNode* LocateElem(LinkList L, ElemType e)
{
ListNode* p;
p = L->next; //指针p指向第一个结点
while (p)
{
if (p->data != e) //如果查出的值与e不相等
p = p->next; //继续下一个的查找 一致查到最后一个元素为Null为止
else
break;
}
return p; //返回查出来的指针p
}
6.定位操作 通过定位找到序号
int LocatePos(LinkList L,ElemType e)
{
ListNode* p;
int i;
if (ListEmpty(L)) //查找第i个元素之前,判断链表是否为空
return 0;
p = L->next;//从第一个结点开始
i = 1;
while (p)
{
if (p->data == e) //找到值与e相等的元素
return i; //返回对应的序号
else
{
p = p->next;
i++;
}
}
if (!p) //如果没有找到e,返回0,表示失败
{
return 0;
}
}
7.单链表读取 通过位置找到对应的元素
int GetElem(LinkList L, int i, ElemType& e)
{
int j;
LinkList p;
p = L->next; //初始化让P指向第一个结点
j = 1;
while (p && j < i) //查找到第i个元素
{
p = p->next;
++j;
}
if (!p || j > i)
{
return 0;
}
e = p->data; //获取查找到指针对应的数据
return 1;
}
8.单链表插入
//将元素e插入到链表的指定位置i
int InsertList(LinkList * L,int i,ElemType e)
{
int j;
LinkList p, q;
p = *L; //初始化
j = 1;
while (p->next!=NULL&&j<i) //找到第i-1个结点,即第i个结点的前驱节点
{
p = p->next;
j++;
}
if (!p || j > i)
{
return 0;
}
q = (LinkList)malloc(sizeof(Node)); //生成新的结点
q->data = e; //将数据赋值给新的结点
q->next = p->next; //将p的后继结点赋值给q后继
p->next = q; //将q赋值到p的后继
return 1;
}
9.单链表的删除
//将元素e从链表的指定位置i删除
int DeteleList(LinkList *L,int i,ElemType e)
{
int j;
LinkList p, q;
p = *L; //初始化
j = 1;
while (p->next != NULL && j < i) //找到第i-1个结点,即第i个结点的前驱节点
{
p = p->next;
j++;
}
if (!p || j > i)
{
return 0;
}
q = p->next; //将要删除的指针赋值给q
e = q->data; //从而查出要删除的q的数据,进行赋值给e
p->next = q->next; //此时p->next=p->next->next 将前驱结点的指针指向要删除的结点的下一个结点
free(q);
return 1;
}
10.销毁单链表
v
oid DestroyList(LinkList * L)
{
LinkList p, q;
p = (*L)->next;
while (p)
{
q = p;
p = p->next;
free(q);
}
}
11.求单链表的表长
int ListLength(LinkList L)
{
LinkList p;
int count = 0;
p = L;
while (p->next!=NULL)
{
p = p->next;
count++;
}
return count;
}
后续:https://blog.csdn.net/wh1236666/article/details/108798683