数据结构入门之单链表的定义及其基本操作

以下链表均为带头结点的单链表

一.单链表类型的的声明

typedef struct Node{//声明一个存储整形数据的单链表类型 
	int data;
	struct Node *next;
}Node,*LinkList;

二.创建单链表——头插法

void CreateListHead(LinkList *L,int n){//头插法创建有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;//随机生成100以内的数字、
	p->next=(*L)->next;
	(*L)->next=p; 
	
 } 
}

创建单链表——尾插法

void CreateLinstTail(linklist *L,int n){//尾插法创建有n个节点的单链表
	
	linklist r,p;//r指向为节点,p生成新节点
	int j;
	srand(time(0));
	(*L)=(LinkList)malloc(sizeof(Node));
	(*L)->next=NULL;
	for(j=0;j<n;j++)
	{
		r=*L;
		p=(Node*)malloc(sizeof(Node));//生成一个新节点
		p->data=rand()%100+1//随机生成100以内的数字 
		r->next=p;
		r=p;
		 
	}
	 r->next=NULL;
}

三.单链表的整表删除

Status ClearLinst(LinkList *L){//清空一个单链表
 
	LinkList p,q;/*将第一个节点赋值给p,循环执行;1将下一节点赋值给q,2释放p,3将q赋值给p*/
		p=(*L)->next;//p指向了第一个节点 
while(p!=NULL)//没到表尾 
	{
	q=p->next; 
	free(p);
	p=q;
	}
	(*L)->next=NULL;//头结点指针域为空 
	return ok;
}

四.读取单链表第i个元素

Status GetElem(linkList L,int i,int *e){//读取链表L中第i个元素,并用e返回,假设线性表L已经存在,1<=i<=listlength(L)
int j;
linklist p;//声明一节点p 
p->L-next;//p指向头结点 
j=1;//j为计数器
while(p&&j<i)//p不为空并且j还没到i时 执行循环
{
	p=p->next;
	j++;
 } 
if(!p||j>i)
return error;
*e=p->data;
return ok;


 
}

五.单链表的插入


status LinkListInsert(Linklist *L,int i,int e;){//需要改变一级指针指向,故函数形参用二级指针
	int j;
	LinkList p,s;
	p=*L;
	j=1;
	while(p&&j<i){//寻找第i个结点
		p=p->next;
		j++; 
	} 
	if(!p||j>i){
		return error;//第i个元素不存在
	}
	s=(LinkList)malloc(sizeof(Node));//生成一个Node类型的结点,并用s指向它
	s->data=e;
	s->next=p->next
	p->next=s;//在第i个结点后插入s
	return ok;
	
	
}

六.单链表的删除

status LinkListdel(LinkList *L,int i,int *e){//删除第i个结点,并用e接收
Linklist p;//定义工作指针
p=(*L)->next//p指向第一个结点 
int j=1;//计数器置1 
while(p->next&&j<i-1){//未找到第i-1个元素,循环继续
p=p->next;
j++; 
}
if(!p||j>i-1)//找不到第I个结点,无法删除 
return error;
*e=p->next->data;
LinkList q=p->next;
p->next=q->next;
free(q);
return ok;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值