单链表。。。

数组:一段连续的内存空间顺序存储
链表:一种新的数据组织形式,链式

typedef int Datatype;
typedef struct Node{
	Datatype data;
	struct Node *next;
}Node,*Linklist;
//头插建立:将新节点插入到当前链表的表头结点之后
int main(){
	//初始化空表 
	Linklist L=(Linklist)malloc(sizeof(Node));
	L->next=NULL;								
	//p1指向的节点
	Linklist p1=(Linklist)malloc(sizeof(Node));
	p1->data=1;
	//将p1指向的节点与L指向的节点相连 
	p1->next=L->next;
	L->next=p1;
	
	Linklist p2=(Linklist)malloc(sizeof(Node));
	p2->data=2;
	p2->next=L->next;
	L->next=p2;
}
//尾插建立:将新节点插入到当前链表的表尾上
int main(){
	Linklist L=(Linklist)malloc(sizeof(Node));
	L->next=NULL;
	Linklist R=L;//建立尾指针R,并始终指向链尾 
	
	Linklist p1=(Linklist)malloc(sizeof(Node));
	p1->data=1;
	p1->next=R->next;
	R->next=p1;
	R=p1;//更新R,指向链尾 
	
	Linklist p2=(Linklist)malloc(sizeof(Node));
	p2->data=2;
	p2->next=R->next;
	R->next=p2;
	R=p2;
}
//单链表的长度
int list_length (Linklist L){//传入单链表的表头指针L 
	int count=0;
	Linklist p=L->next;
	while(p){
		count++;
		p=p->next;
	}
	return count;
}
//找到值为x的节点 
Linklist search_x(Linklist L,Datatype x){
	Linklist p=L->next;
	while(p){
		if(p->data!=x){
			p=p->next;
		}else{
			break;//查找成功 
		}
	}
	if(p==NULL){//查找失败 
		printf("没有找到值为%d的节点!",x);
	}
	return p;
}

在这里插入图片描述
删除
在这里插入图片描述

//删除L中p指向的节点 
void Dellist(Linklist L,Linklist p){
	Linklist pre=L->next;
	while(pre->next!=p){//找到p的前驱节点
		pre=pre->next;
	}
	pre->next=p->next;
	free(p);
}
//将单链表就地逆置(L指向的节点不存数据,dummy node),使用头插的方式
void rev(Linklist L){
	Linklist p=L->next,q;//p先预存第一个节点的位置 
	L->next=NULL;//将表头和其他节点断开
	while(p){
		q=p->next;//记录q为p的后一个节点,预存后边节点的位置
		p->next=L->next;//p指向的节点作为新插入的节点,头插建立,插入到头节点之后
		L->next=p;
		p=q;//更新p 
	}
} 
单链表的合并
非递减有序排列:即递增,但不是严格单调递增
两个单链表LA和LB,其元素均为非递减有序排列.现将他们合并为LC,要求LC也是非递减有序排列

在这里插入图片描述

// 将两个非递减有序排列单链表 LA 和 LB 合并为非递减有序排列 LC 
Linklist merge(Linklist LA,Linklist LB){
	Linklist pa,pb,LC,R;
	pa=LA->next;							// 预存后边节点的位置 
	pb=LB->next;
	LC=LA;									// 可以选择 LA 或 LB作为合并后单链表的表头指针 LC 
	LC->next=NULL; // 进行断开 
	R=LC; // 设置尾指针 
	
	// 循环比较找到值最小的节点进行尾插。 
	while(pa&&pb){
		if(pa->data<=pb->data){
			R->next=pa;
			R=pa;					// pa指向的节点中的数据更小时,将 pa 指向的节点进行插入 (尾插)。 
			pa=pa->next;		// pa 向后移 
		}else{
			R->next=pb;
			R=pb;					// pb指向的节点中的数据更小时,将 .... 
			pb=pb->next;		// pb 向后移 
		}
	}

	// 循环结束后没有结束的表节点 直接串联到尾指针之后。 
	if(pa){			 
		R->next=pa;
	}else{			// 当 pa和pb二者有一个是 NULL时   直接将尾指针和后续节点连接
		R->next=pb;
	}
	free(LB);
	return LC;	
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值