单链表的新建、查找和删除

一、头插法新建链表

1、先让新结点指向头结点所指向的结点
2、再让头结点指向新结点

//头插法新建链表 
void head_insert_list(Linklist &L) //Linlilist 与Lnode*等价 
{
	Elemtype e;
	scanf("%d", &e);
	Linklist s; //s指针用来记录新申请的结点
	while(e!=9999)
	{
		s = (Linklist)malloc(sizeof(Lnode)); //申请新空间 用s指向它 
		s->data = e;
		s->next = L->next; 
		L->next = s;
		scanf("%d", &e);
	}
}

二、尾插法新建链表

1、让当前链表的尾结点指向新申请的结点
2、r用来指向当前链表的尾结点,所以每插入一个新结点,都要后移r指针
3、最后让尾结点的指针域为NULL

//尾插法新建链表 
void tail_insert_list(Linklist &L)
{
	Elemtype e;
	scanf("%d", &e);
	Lnode *s, *r=L; //s指针用来记录新申请的结点 r用来始终指向尾结点 
	while(e!=9999)
	{
		s = (Linklist)malloc(sizeof(Lnode));
		s->data = e;
		r->next = s;  
		r = s; //更新r指针到当前链表的尾结点 
		scanf("%d", &e);
	}
	s->next = NULL; //最后一个结点的指针域为空 
}

三、按位置查询

1、判断查询位置是否合理
2、移动指针至要查询的位置
3、i用来记录指针的位置

//按位置查询 
Linklist search_bylocation(Linklist L, int pos)
{
	int i=0; //i用来记录指针的位置 
	if(pos<0)  //如果查询的位置不合理 
	{
		return NULL;
	}	
	while(L&&i<pos) //L不为空 
	{
		L=L->next; //L指针向后移动 
		i++;
	}	
	return L;
}

四、按值查询

1、i用来记录指针的位置
2、指针遍历链表,判断指针所指向结点的数据是否符合条件
3、若不符合条件,指针后移

//按值查询 
int search_byvalue(Linklist L, Elemtype val)
{
	int i=0; //用i来记录指针的位置 
	while(L) //L结点不是NULL 
	{
		if(L->data==val)
		{
			return i;
		}
		L = L->next;
		i++;
	}
	return -1;
}

五、单链表的删除

1、用指针接收要删除的结点的前一个结点
2、拿到要删除的结点
3、把要删除的结点的后一个结点赋值给要删除的结点的前一个结点
4、释放删除的结点空间

bool delete_list(Linklist L, int pos)
{
    Linklist p = search_bylocation_list(L, pos-1); //拿到要删除结点的前一个结点
    if(p==NULL)
    {
        return false;
    }
    Linklist q = p->next; //拿到要删除的结点指针
    p->next = q->next;
    free(q);
    return  true;
}

六、完整代码

#include<stdio.h>
#include<stdlib.h>
typedef int Elemtype;
typedef struct Lnode{
	Elemtype data;  //数据域 
	struct Lnode *next; //指针域 
}Lnode, *Linklist; 
//头插法新建链表 
void head_insert_list(Linklist &L) //Linlilist 与Lnode*等价 
{
	Elemtype e;
	scanf("%d", &e);
	Linklist s; //s指针用来记录新申请的结点
	while(e!=9999)
	{
		s = (Linklist)malloc(sizeof(Lnode)); //申请新空间 用s指向它 
		s->data = e;
		s->next = L->next; 
		L->next = s;
		scanf("%d", &e);
	}
}
//尾插法新建链表 
void tail_insert_list(Linklist &L)
{
	Elemtype e;
	scanf("%d", &e);
	Lnode *s, *r=L; //s指针用来记录新申请的结点 r用来始终指向尾结点 
	while(e!=9999)
	{
		s = (Linklist)malloc(sizeof(Lnode));
		s->data = e;
		r->next = s;  
		r = s; //更新r指针到当前链表的尾结点 
		scanf("%d", &e);
	}
	s->next = NULL; //最后一个结点的指针域为空 
}
//按位置查询 
Linklist search_bylocation(Linklist L, int pos)
{
	int i=0; //i用来记录指针的位置 
	if(pos<0)  //如果查询的位置不合理 
	{
		return NULL;
	}	
	while(L&&i<pos) //L不为空 
	{
		L=L->next; //L指针向后移动 
		i++; //i 
	}	
	return L;
}
//按值查询 
int search_byvalue(Linklist L, Elemtype val)
{
	int i=0; //用i来记录指针的位置 
	while(L) //L结点不是NULL 
	{
		if(L->data==val)
		{
			return i;
		}
		L = L->next;
		i++;
	}
	return -1;
}
//单链表的删除
bool delete_list(Linklist L, int pos)
{
    Linklist p = search_bylocation_list(L, pos-1); //拿到要删除结点的前一个结点
    if(p==NULL)
    {
        return false;
    }
    Linklist q = p->next; //拿到要删除的结点指针
    p->next = q->next;
    free(q);
    return  true;
}
//打印单链表 
void print(Linklist L)
{
	L=L->next; //从第一个结点开始 而不是头结点 
	while(L!=NULL) // 
	{ 
		printf("%3d", L->data);
		L = L->next;
	}
	printf("\n");
}

int main()
{
	Linklist L;  //L是链表头指针 是结构体类型 
	L = (Linklist)malloc(sizeof(Lnode)); //申请头结点空间 头指针指向它 
	L->next = NULL; //头结点的指针暂时为空 
	head_insert_list(L); //头插法新建链表 
	print(L);
	tail_insert_list(L); //尾插法新建链表 
	print(L);
	Elemtype ret; //用来接收函数的返回值 
	ret = search_bylocation(L, 4); //查找第四位的元素是谁 
	printf("%d\n",ret);
	Linklist i = search_byvalue(L, 6); //查找值为6的元素值的位置 
	delete_list(L, 4);
	print(L);
	return 0;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘学.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值