数据结构之链表01

链表存储是在程序运行过程中动态分配空间,只要存储空间还有空间,就不会发生存储溢出问题 。
  优点:插入和删除速度快,保有原有的物理顺序。比如,插入或者删除一个元素时,只需要改变指针指向即可。缺点:查找速度慢,因为查找时,需要循环链表访问 。

#include<stdio.h> 
#include<stdlib.h> 

//链表,别名链式存储结构或单链表
//链表不限制数据的物理存储状态,使用链表存储的数据其物理存储位置是随机的
//链表的节点:数据域和指针域,链表实际存储的是一个一个的节点 
//创建一个存储 {1,2,3,4} 链表
//链表的初始化:声明一个头指针,创建节点

//定义节点
//typedef给结构体等类型定义别名
typedef struct Link{
	int elem;
	struct Link * next;	
}link;          //link是Link的别名;可以用别名来声明数据类型
 

//初始节点
link * init_link(){
	
	//创建头结点
	 
	link * p = NULL;  //创建指向头结点的指针
	link * temp = (link*)malloc(sizeof(link));    // 创建头节点
	//头结点初始化 
	p = temp;
	
	//从第一个节点开始创建
	for(int i=1; i<5; i++){
		link * a = (link*)malloc(sizeof(link));   //动态分配存储空间 
		a->elem = i;
		a->next = NULL;
		temp->next = a;
		//更新temp
		temp = temp->next; 
	} 
	//返回建立的节点,只返回头指针 p即可,通过头指针即可找到整个链表
	return p;
			
} 

void dispaly_elem(link *p){
	link * temp = p;
//	temp = temp->next;
//	while(temp){
//		printf("%d\n",temp->elem);
//		temp = temp->next;
//	}
	while(temp->next){
		temp = temp->next;
		printf("%d\n",temp->elem);
		
	}
//	printf("%d\n",p);
//	printf("%d\n",&p);
} 


// 链表的基本操作增、删、改、查; 
link * insertElem(link *p, int elem, int pos)   //pos指的是在第几个节点后插入
{
	link *temp = p; 
	//找到要插入位置的上一个节点 
	for(int i=0; i<pos; i++){
		temp = temp->next;
	} 
	//初始化新插入的结点 
	link *c = (link*)malloc(sizeof(link));   
	//先对新插入的结点与后继结点进行连接,再将插入的结点与前驱结点相连
	c->next = temp->next; 
	temp->next = c; 
	c->elem = elem;
	
	return p;
	
	 
	
} 

//删除指定位置的结点 
link * deleteElem(link *p,  int pos){
	//pos指的是要删除元素的位置
	link * temp = p;
	//找要删除结点的前一个结点
	for (int i=0; i<pos-1; i++){
		temp=temp->next;
	}
	link * a=temp->next;
	temp->next=temp->next->next;
	a->next = NULL;
	free(a);

return p;
}

//查找指定元素,并返回元素的位置
int searchElem(link *p, int elem)
{
	//elem指的是要查找的元素
	link * temp = p->next;
	//初始pos,pos是要返回元素的位置
	int pos = 1;
	//查找结点的位置
	while(temp){
		if(temp->elem == elem){
			break;
		}
		temp=temp->next;
		pos++;
	}
	return pos;
}


//更新指定位置结点的元素
//.... 


int main(){
	link *p = init_link();
	printf("%d\n",p);
	printf("\n");
//	printf("%d\n",&p);
	dispaly_elem(p);
	
	//在第二个元素之后插入新结点 
	p=insertElem(p,24,2);
	printf("在第二个元素之后插入新结点\n");
	printf("%d\n",p);
	dispaly_elem(p);
	
	//删除第二个元素
	p=deleteElem(p,2);
	printf("删除第二个元素\n");
	printf("%d\n",p);
	dispaly_elem(p);
	
	//查找值为24的元素的位置 
	int posi=searchElem(p,24);
	printf("查找值为24的元素的位置\n");
	printf("%d\n",posi);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值