数据结构学习【1.单链表】2021-11-12
今天来学习单链表的操作吧
头文件和一些自定义类型,这里都默认类型为整形
#include <stdio.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int ElemType;
链表的基本结构,每一个元素包括其数据data和后继next
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
查询操作,传入链表L和下标i,获得其data
主要步骤:
1、设置计数器j,设置p为链表第一个
2、用while查询到第i个元素
3、用*e返回数据
typedef struct Node *LinkList;
Status GetElem(LinkList L, int i,ElemType *e) //1<=i<=length
{
int j;
LinkList p;
p=L->next;
j=1; //j is a counter
while(p&&j<i) //p is not null and j is less than i
{
p=p->next;
++j;
}
if (!p||j>i)
return ERROR;
*e=p->data;
return OK;
}
插入操作,在第i的位置插入一个新元素
主要步骤:
1、设置计数器j,链表元素p和s,p为头节点,s为待插入节点
2、查询到第i个元素
3、为s申请内存,插入的data赋值给s
4、s接到p的下一个,p接s
Status ListInsert(LinkList *L,int i,ElemType e)
{
int j;
LinkList p,s;
p=*L;
j=1;
while(p&&j<i)
{
p=p->next;
++j;
}
if(!p||j>i)
return ERROR;
s=(LinkList)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
return OK;
}
删除操作,将第i个元素删除
操作:
1、计数器j,p为头节点,q为待删除结点
2、查询到第i个元素,注意这里的第i个元素是p->next
3、q赋值为p->next
4、q->next接p->next
5、释放q
Status ListDelete(LinkList *L,int i,ElemType *e)
{
int j;
LinkList p,q;
p=*L;
j=1;
while(p->next&&j<i)
{
p=p->next;
++j;
}
if(!p->next||j>i)
return ERROR;
q=p->next;
p->next=q->next;
free(q);
return OK;
}
建立链表,采用头插发,每个元素赋值为随机数
1、L分配内存
2、L的后继设为空
3、在循环中给p分配内存,给p的data赋值,p的后继赋值为*L的后继,*L的后继为p(原理同插入)
void CreateListHead(LinkList *L, int n)
{
LinkList p;
int i;
srand(time(0));
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
p->data=rand()%100+1;
p->next=(*L)->next;
(*L)->next=p;
}
}
单链表的建立,尾插法
1、给*L分配内存,r为头节点
2、为p分配内存,给p的data赋值,
3、r的后继为p,r赋值为p
void CreatListTail(LinkList *L,int n)
{
LinkList p,r;
int i;
srand(time(0));
*L=(LinkList)malloc(sizeof(Node));
r=*L;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
p->data=rand()%100+1;
r->next=p;
r=p;
}
r->next=NULL;
}
链表的清空
1、p指向第一个节点
2、循环:没到表尾
3、q为p的后继
4、删除p
5、p赋值为q
6、结束循环,头节点指向空
Status ClearList(LinkList *L)
{
LinkList p,q;
p=(*L)->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;
return OK;
}
坚持写博客的第一天
指鹿为马,未来可期!
本文详细介绍了单链表的基础结构,包括数据结构、查询操作(GetElem)、插入(ListInsert)、删除(ListDelete)等,以及创建链表(CreateListHead, CreatListTail)的方法。通过实例演示了如何在链表中实现这些关键操作,并展示了头插法和尾插法的创建过程。
974

被折叠的 条评论
为什么被折叠?



