#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string>
using namespace std;
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
//定义链表结构-节点结构
typedef struct LNode
{
ElemType date;
struct LNode *next;
}LNode,*Linklist;//Linklist--Lode* 是相互等价
//区别:
//指针变量: 表示结点地址 LNode s;//s是结点 访问成员 s.date
//结点变量:表示一个结点 LinkList p;//p是指针 p->date ai
//初始化链表
Status InitLinklist(Linklist &L)
{
L = (LNode*)malloc(sizeof(LNode));
if (!L)
return ERROR;
L->next = NULL;
return OK;
}
//创建N个元素的单链表(前插法)//放在头节点之前加一个新的
Status CreakLinklist(Linklist &L, int n)
{
for (int i = 0; i < n; i++)//循环n次
{
LNode *p = (LNode*)malloc(sizeof(LNode));//申请一个结点p,p指向申请结点的空间
if (!p)
return ERROR;
scanf("%d", &p->date);//申请到空间后,用键盘给结点赋值。
p->next = L->next;//L是在主函数中新定义的一个单链表,而p是在CreakLinklist里面定义的一个指针
L->next = p;
//这两个语句的顺序是不能倒过来,这样会导致数据的丢失
}
return OK;
}
//创建N个元素的单链表(尾插法)
Status CreateLink_L(Linklist &L, int n)
{
LNode *r = L;
for (int i = 0; i < n; i++)
{
LNode *p = (LNode*)malloc(sizeof(LNode));
if (!p)
return ERROR;
scanf("%d", &p->date);
p->next = NULL;
r->next = p;
r = p;
}
return OK;
}
void DispLinklist(Linklist L)//显示指针
{
LNode *p = L->next;//指针p指向第一个结点的next
while (p)
{
printf(" %d", p->date);
p = p->next;
}
printf("\n");
}
//获取位置为i的元素
Status GetElem(Linklist L, int i)
{
ElemType e;
Linklist p = L->next;
int j = 1;
while (p&&j < i)
{
p = p->next;
j++;
p = p->next;
}
if (!p || j < i)
return ERROR;
e = p->date;
printf("%d", e);
}
//查找元素e所在的位置
Status LocateLink(Linklist L, ElemType e)
{
Linklist p = L->next;
int j = 1;
while (p)
{
if (p->date == e)
return j;
else
{
p = p->next;
j++;
}
}
}
//链表的插入(在第i个元素插入)
Status InsetLink(Linklist &L, ElemType e, int i)
{
Linklist p = L, s;
int j=0;
while (p&&j<i - 1)
{
p = p->next;
j++;
}
if (!p || j>i-1)
return ERROR;
s = (LNode*)malloc(sizeof(LNode));
if (!s)
return ERROR;
s->date = e;
s->next = p->next;
p->next = s;
return OK;
}
//删除链表第i个结点
Status DeletdLink(Linklist &L, int i)
{
ElemType e;
Linklist p = L,q;
int j = 0;
while (p&&j < i - 1)
{
p = p->next;
j++;
}
if (!p || j>i - 1)
return ERROR;
q = p->next;//q是临时保存要被删除的元素
e = q->date;//
q->next = q->next;
printf("%d\n", e);
free(q);
return OK;
}
//判断表长是否为空
Status ListEmpty(Linklist L)
{//若L为空表,则返回1,否则返回0
if (L->next)//非空
return ERROR;
else
return OK;
}
//销毁指针
Status DestroyLinst(Linklist &L)
{
Linklist p, q;
p = L;//p指向头节点
while (p)//没到表尾
{
q = p->next;
free(p);
p = q;
}
return OK;
}
//清空链表
Status ClearLinst(Linklist &L)
{
//将L重置为空表
Linklist p, q;
p = L->next;//p指向第一个结点
while (p)//没有表尾
{
q = p->next;
free(p);
p = q;
}
L->next = NULL;//头节点指针域为空
return OK;
}
int main()
{
Linklist L;//是定义了一个struct类型的指针L
InitLinklist(L);//初始化链表
//CreakLinklist(L,5);//前插法
//DispLinklist(L);//显示单链表
CreateLink_L(L, 5);//尾插法
DispLinklist(L);
InsetLink(L, 123, 3);//在第i个元素插入e的值
DispLinklist(L);
DeletdLink(L, 4);//删除链表中第4个元素
DispLinklist(L);//显示链表
ClearLinst(L);//清空链表
DestroyLinst(L);//销毁链表
system("pause");
return 0;
}
数据结构中单链表结构的创建、链表初始化、前插法、尾插法、获取第i位置元素、查找元素e的位置、链表的插入和删除、判断表长、清空和销毁链表等操作
最新推荐文章于 2022-11-19 18:37:51 发布