动态链表的 增,删,改,查

1,动态创建链表

动态创建链表的 与静态创建链表是不同的。静态 是需要 将链表节点的数据提前 赋值。而动态链表的创建不需要提前将值赋值给节点,而是可以通过 数值输入来为节点赋值。

静态链表:需要提前 给每一个节点赋值。

        每一次只能赋值一次 ,更改麻烦。

        每一次更改都需要去找定义的节点 然后更改节点的值,不方便。

动态链表:不需要提前给链表每一个节点赋值。可以通过 人为提供的窗口为 节点赋值。

        可以任意 给链表赋值。

        增 ,删,改,查,都不需要去挨个找值,可以通过函数实现。

动态链表的创建:

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Test
{
	int num;
	struct Test* next;
};


//动态创建链表
struct Test* creatForLink(struct Test*head)
{
	//struct Test*p = head;
	struct Test*new;
	printf("请输入数据\n");
	while(1)
	{
		new = (struct Test*)malloc(sizeof(struct Test)); //每一次创建一个新的节点都需要向内存申请空间
														//这个空间申请之后,在这个作用域是不能被释放的要free()
		new->next =NULL;     //让new 里面的结构体指针为空,
	
		scanf("%d",&(new->num));
		if(new->num == 10086)  //输入终止条件,输入10086跳出循环
		{
			printf("输入结束\n");
			return head;
		}
		head = addLink2(head,new); //这里要注意 addLink1 的返回值需要有 结构体指针变量来承接
	}
}

增,就是在链表的某一个节点处 将新节点插入进去。有头插法,尾插法。

这里我们用尾插法。

尾插法函数的部分代码。

///增加 链表的元素的个数  通过尾插法 增加链表的节点
struct Test* addLink3(struct Test*head)
{
	struct Test*p = head;
	struct Test*new;
	int a;
	//struct Test*p = head;
	new = (struct Test*)malloc(sizeof(struct Test)); //申请空间 
	new->next =NULL;     //
	printf("请输入插入的位置\n");
	scanf("%d",&a);
	printf("请输入修改的数据\n");
	while(p!=NULL){
		
		if(a == p->num)
		{
			scanf("%d",&(new->num));
			new->next = p->next;
			p->next = new;
			return head;
		}
		p = p->next;
	}
	printf("越界\n");
	return head;
}

3,删

删除链表的某个i节点。

就是把指向 下一个节点的指针 指向下下一个节点。


//删除
struct Test* delete1(struct Test*head)
{
	struct Test*p = head;
	int data;
	printf("请输入删除数据的位置\n");
	scanf("%d",&data);
	if(p->num == data){  //头节点的删除方式
		p = p->next;
		return p;
	}
	while(p->next !=NULL)  //非头节点的删除方式。
	{
		if(p->next->num == data)    
		{
			p->next = p->next->next;
			return p;
		}
		p = p->next;
	}
	return head;
}

3,改

改,改变链表节点的数据


//改链表里面的数据
struct Test* changerLink1(struct Test*head)
{
	struct Test*p = head;
	int data1,data2;
	printf("请输入更改数据的位置\n");
	scanf("%d",&data1);
	printf("请输入更改的数据\n");
	scanf("%d",&data2);
	while(p !=NULL)
	{
		if(p->num == data1)
		{
			p->num = data2;
			return head; 
		}
		p= p->next;
	}
	printf("没有您要更改的数据\n");
	return head;
}

4,查

查,查看链表节点的数据。


// 链表的查找

struct Test* lookoutLink1(struct Test*head)
{
	struct Test*p = head;
	int data;
	printf("请输入您要查找的数据\n");
	scanf("%d",&data);
	while(p!=NULL)
	{
		if(p->num == data)
		{
			printf("链表由此数据,数据为%d\n",p->num);
			return head;
		}
		p = p->next;
	}
	printf("没有此数据\n");
	return head;
}

5,全部代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Test
{
	int num;
	struct Test* next;
};
///增加 链表的元素的个数  通过尾插法 增加链表的节点
struct Test* addLink3(struct Test*head)
{
	struct Test*p = head;
	struct Test*new;
	int a;
	//struct Test*p = head;
	new = (struct Test*)malloc(sizeof(struct Test)); //申请空间 
	new->next =NULL;     //
	printf("请输入插入的位置\n");
	scanf("%d",&a);
	printf("请输入修改的数据\n");
	while(p!=NULL){
		
		if(a == p->num)
		{
			scanf("%d",&(new->num));
			new->next = p->next;
			p->next = new;
			return head;
		}
		p = p->next;
	}
	printf("越界\n");
	return head;
}


//删除
struct Test* delete1(struct Test*head)
{
	struct Test*p = head;
	int data;
	printf("请输入删除数据的位置\n");
	scanf("%d",&data);
	if(p->num == data){  //头节点的删除方式
		p = p->next;
		return p;
	}
	while(p->next !=NULL)  //非头节点的删除方式。
	{
		if(p->next->num == data)    
		{
			p->next = p->next->next;
			return p;
		}
		p = p->next;
	}
	return head;
}

//改链表里面的数据
struct Test* changerLink1(struct Test*head)
{
	struct Test*p = head;
	int data1,data2;
	printf("请输入更改数据的位置\n");
	scanf("%d",&data1);
	printf("请输入更改的数据\n");
	scanf("%d",&data2);
	while(p !=NULL)
	{
		if(p->num == data1)
		{
			p->num = data2;
			return head; 
		}
		p= p->next;
	}
	printf("没有您要更改的数据\n");
	return head;
}

// 链表的查找

struct Test* lookoutLink1(struct Test*head)
{
	struct Test*p = head;
	int data;
	printf("请输入您要查找的数据\n");
	scanf("%d",&data);
	while(p!=NULL)
	{
		if(p->num == data)
		{
			printf("链表由此数据,数据为%d\n",p->num);
			return head;
		}
		p = p->next;
	}
	printf("没有此数据\n");
	return head;
}

/************************************************************/

//删除
struct Test* delete(struct Test*head,int data)
{
	struct Test*p = head;
	if(p->num == data) //头节点的删除方式
	{
		p = p->next;
		return p;
	}
	while(p !=NULL)
	{
		if(p->next->num == data)
		{
			p->next = p->next->next;
			return head;
		}
		p = p->next;
	}
}

//改链表里面的数据
struct Test* changerLink(struct Test*head,int data1,int data2)
{
	struct Test*p = head;
	while(p !=NULL)
	{
		if(p->num == data1)
		{
			p->num = data2;
			return head; 
		}
		p= p->next;
		
	}
	printf("没有您要更改的数据\n");
	return head;
}

// 链表的查找

int lookoutLink(struct Test*head,int data)
{
	struct Test*p = head;
	while(p!=NULL)  //遍历链表
	{
		if(p->num == data) //找到与之相等的值
		{
			printf("链表由此数据,数据为%d\n",p->num);
			return p->num;
		}
		p = p->next;
	}
	printf("没有此数据\n");
	return 0;
}

//尾插法
struct Test* addLink2(struct Test*head,struct Test*new)
{
	struct Test*p = head;
	if( NULL==p )
	{
		//printf("new->num == %d",new->num);
		p = new;
		return p; //这里要注意 返回的时候 返回的是 临时变量P 如果返回head 又回到空指针\
		          //重复 执行这个条件。
	}
	while(p->next!=NULL){  //找到 p->next 不为空 为空的话就进行指针偏移。知道不为空为止
		//printf("new->num = %d",new->num);
		p = p->next;
	}
	p->next = new; //把最后的一个元素插入到p->next
	return head;	//
}



//头插法
struct Test* addLink1(struct Test*head,struct Test*new)
{
	struct Test*p = head;
	if(head == NULL)  //头节点为空的时候 就把new 给到 head,让头节点有值
	{
		head = new;
		printf("new->num %d",new->num); //测试用的
		return head;
	}else{
		head->next = new; //当头节点不为空的时候 把new的地址 存放到 head->next中
		return head;   //返回头节点
	}
}

//动态创建链表
struct Test* creatForLink(struct Test*head)
{
	//struct Test*p = head;
	struct Test*new;
	printf("请输入数据\n");
	while(1)
	{
		new = (struct Test*)malloc(sizeof(struct Test)); //每一次创建一个新的节点都需要向内存申请空间
														//这个空间申请之后,在这个作用域是不能被释放的要free()
		new->next =NULL;     //让new 里面的结构体指针为空,
	
		scanf("%d",&(new->num));
		if(new->num == 10086)  //输入终止条件,输入10086跳出循环
		{
			printf("输入结束\n");
			return head;
		}
		head = addLink2(head,new); //这里要注意 addLink1 的返回值需要有 结构体指针变量来承接
	}
}


//链表的输出
void printLink(struct Test*head)
{
	struct Test*p = head ;
	while(p!=NULL)
	{
		printf("%d ",p->num);
		p=p->next;
	}
	printf("\n");
}



int main()
{
	struct Test*head =NULL;
	struct Test*kunkun ;
	int data2 = 0;
	int cmd = 0;
	struct Test* (*pfunc)(struct Test*);
	head = creatForLink(head);
	printLink(head);
	printf("[1]增  [2]删  [3]改  [4]查  \n");
	scanf("%d",&cmd);
	
	switch(cmd)
	{
		case 1:
		pfunc = addLink3;
		break;
		case 2:
		pfunc = delete1;
		break;
		case 3:
		pfunc = changerLink1;
		break;
		case 4:
		pfunc = lookoutLink1;
		break;
		default:
		printf("输入错误\n");
		exit(-1);
		break;
	}
	kunkun = pfunc(head);
	printf("jjjj\n");
	printLink(kunkun);
	
	
	return 0;
}

/*************
struct Test*heade = creatForLink(head);
	printLink(heade);
	heade = delete(heade,3);
	printLink(heade);
	heade = changerLink(heade,6,1009);
	printLink(heade);
	data2 = lookoutLink(heade,1);
	
	
	
*/
	
	

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

爱坤学编程

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

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

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

打赏作者

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

抵扣说明:

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

余额充值