note3

1.链表介绍
●链表是一种物理存储单元上非连续、非顺序的存储结构
●链表由一系列结点(链表中每一-个元素称为结点)组成
●每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域
●数据元素的逻辑顺序是通过链表中的指针链接次序实现的

链表可分为,静态链表,动态链表

静态链表举例

#include<stdio.h>
#include<stdlib.h>
struct linknode{
	int data;
	struct linknode*next;
};
void test(){
	struct linknode node1={10,NULL};
	struct linknode node2={20,NULL};
	struct linknode node3={30,NULL}; 
	struct linknode node4={40,NULL}; 
	struct linknode node5={50,NULL};
	struct linknode node6={60,NULL};
		
	node1.next=&node2;
	node2.next=&node3;
	node3.next=&node4;
	node4.next=&node5;
	node5.next=&node6;
	   
	struct linknode *pc=&node1; 
	while(pc!=NULL)
	{
		printf("%d",pc->data);
		pc=pc->next;
	}
}
int main()
{
	test();
	return 0;
 } 

可分为单向链表,双向链表,循环链表,单向循环链表,双向循环链表

 

链表的创建

1.定义一个新结构体结点(火车车厢)
2.为该结构体结点申请空间
3.将该结构体结点的内存全部清0(让新结点的Next为空)
4.将插入的值传到该结构体结点中对应的值中
5.如果链表为空:头结点和尾结点都指向该结点(结构体的变量名代表该结构体的首地址)
6.如果链表不为空:先将原有链表的头指针,赋给新结点的Next((Next是结构体里自带的指向下-结点地址的指针,已定义),再将新结点作为链表头(如下)

struct linkenode* createlist()
{
	struct linkenode* header = (struct linkenode*)malloc(sizeof(struct linkenode));
	header->next = NULL;
	return header;
}

链表的增删改查

增-新增一段新节点

首先先定义一段结构体

然后分配内存

定义数据域和指针域,注意此时指针最好直接指向空指针

struct linkenode* createnode(int data)
{
	struct linkenode* newnode = (struct linkenode*)malloc(sizeof(struct linkenode));
	newnode->data = data;
	newnode->next = NULL;
	return newnode;

 

首先找到被删的位置,运用指针找到对应的data

如果找不到就返回

如果找到了看一下位置

因为要把尾部指针最后调整一下

使被删节点两边可以连上

void shan (struct linknode*header);//删除 
{
	struct linknode*ppre=header;
	struct linknode*prignt=header->next;//定义两个辅助指针 
	while(pright!=NULL){
		if(pright->data=oldval){
			break;
		}
		ppre=pright;
		prght=prght->next;
	}
	if(pright==NULL){
		return; 
		printf("链表中无此数据"); 
	}
	
	ppre=pright->next;
	free(pright) 
	pright=NULL;
}

先看头指针是否为空

然后找到data对应数据,将其改为想要的数据n

void gai (struct linknode*header,int data,int n)//改 
{
	if (header == NULL)
	{
		printf("此后无链表");
	}
	else 
	{
		while (header->data != data)
		{
			header = header->next;
			if (header->next == NULL)
			{
				printf("链表中没有该数据");
			}
		}
		header->data = n;
	}

}

和修改大致相同不过把修改变成了计数,指针每挪动一位,计数器加一,可得

void cha(struct node* headnode, int data)
{
	int p = 0;
	if (header == NULL)
	{
		printf("无链表");
	}
	else
	{
		while (header->data != data)
		{
			header = header->next;
			p++;
			if (header == NULL)
			{
				printf("链表中没有该数据");
			}
		}
		printf("这是第%d位",i);
	}
}

头插

首先找到插入的位置,运用指针找到对应的data

如果找不到就返回

如果找到了看一下位置

因为要把尾部指针最后调整一下

使插入节点两边可以连上

void toucha (struct linknode*header,int oldval,int newval)//头插 
{
	struct linknode*ppre=header;
	struct linknode*prignt=header->next;//定义两个辅助指针 
	while(pright!=NULL){
		if(pright->data=oldval){
			break;
		}
		ppre=pright;
		prght=prght->next;
	}
	if(pright==NULL){
		return; 
		printf("链表中无此数据"); 
	}
	//先创建新节点
	 struct  linknode*newnode=malloc(sizeof(struct  linknode) );
	 newnode->data=newval;
	 newnode->next=NULL;
	newnode->data=pright;
	ppre->next=newnode;
}

尾插

先看头指针是否为空,然后将被插入部分地址给NULL,被插入部分尾部指针变成NULL

void weicha (struct linknode*header,int data);//尾插 
{
	//先创建新节点
	 struct  linknode*newnode=malloc(sizeof(struct  linknode) );
	 newnode->data=newval;
	 newnode->next=NULL;
	if (header == NULL)
	{
		printf("无链表");
	}
	else
	{
		while (header->next != NULL)
		{
			header = header->next;
		}
		header->next = newnode;
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值