单链表的存储结构代码描述:
//线性表的单链表存储结构
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList ; //定义LinkList;
单链表的读取:
#include<cstdio>
Status GetElem(LinkList L,int i,ELemType *e)
{
int j;
LinkList p;//声明一结点p
p=L->next;//让p指向链表的第一个结点
j=1;//j为计数器,j从1开始
while(p&&j<i)//p不为空或者计数器j还没有等于i时,循环继续
{
p=p->next;//让p指向下一个结点
++j;
}
if(!p||j>i)
return ERROR;//第i个元素不存在
*e=p->data;//取第i个元素的数据
return Ok;
}
单链表的插入:
#include<cstdio>
int Status ListInsert(LinkList *L,int i,ELemType e)
{
int j;
LinkList p,s;
p=*L;//声明一节点p指向链表的第一个结点;
j=1;//j初始化从1开始;
while(p&&j<i)//p的指针向后移动,寻找第i个结点 ,j累加1
{
p=p->next;
++j;
}
if(!p||j>i) return ERROR;//第i个元素不存在
s=(LinkList)malloc(sizeof(Node));//生成新节点
s->data=e;
s->next=p->next;
p-next=s;
return ok;
}
单链表的删除:
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j;
LinkList p,q;
p=*L;//声明一结点p指向链表的第一个结点,初始化j从1开始
j=1;
while(j<i&&p->next) //当j<i时,就遍历链表,让p的指针向后移动,不断指向下一个结点,j累加1;
{
p=p->next;
++j;
}
if(!(p->next)||j>i) return ERROR;//若到链表末尾p为空,则说明第i个元素不存在;
q=p->next;
p->next=q->next;
*e=q->data;
free(q);
return ok;
}
单链表的整表创建:
//头插法
void CreateListHead(LinkList *L,int n)
{
LinkList p;//声明一结点p和计数器变量i;
int i;
srand(time(0));//初始化随机数种子,即初始化一空链表L。
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;//让L的头结点的指针指向NULL,即建立一个带头结点的单链表;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));//生成一新结点赋值给p;
p->data=rand()%100+1;//随机生成一个100以内的数字赋值给p的数据域p->data;
p->next=(*L)->next;//将p插入到头结点与前一新结点之间。
(*L)->next=p;//插入到表头
}
}
//尾插法
void CreateListTail(LinkList *L,int n)
{
LinkList p,r;
int i;
srand(time(0));//初始化随机数种子
*L=(LinkList)malloc(sizeof(Node));//为整个线性表
r=*L;//*r为指向尾部的结点
for(i=0;i<n;i++)
{
p=(Node*)malloc(sizeof(Node));//生成新结点
p->data=rand()%100+1;//随机生成100以内的数字
r->next=p;//将表尾终端的结点的指针指向新结点
r=p;//将当前的新结点定义为表尾终端结点
}
r->next=NULL;//表示当前链表结束。
}
单链表的整表删除:
Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next;//*p指向第一个结点
while(p)//没到表尾
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;//头结点指针域为空
return OK;
}