单链表的创建,打印及删除最大值

  1.下面的以头插法建立一个单链表,此单链表当从键盘上输入的值为0时,结束输入 

#include <stdio.h>
#include <stdlib.h>
//定义一个单链表的结点(由data域和next指针域组成的结构体)
typedef struct LinkListNode{
	int data; //整型数据域
	struct LinkListNode * next; //next指针域
}LLNode;    //结构体的名字:struct LinkListNode或LLNode

//循环录入数据,创建一个单链表,当输入数据为0时,结束创建
struct LinkListNode * createLinkList(){
	printf("创建单链表,依次输入单链表结点数据(整数)并回车,输入0结束");
	//创建第一个单元
	LLNode *p, *head, *tail;  //p是一个临时指针,用来接收创建的结点 //head指向头结点 //tail指向尾结点
	p = (LLNode*) malloc(sizeof(LLNode));
	scanf("%d", &(p->data));
	if(p->data == 0){
		return NULL;  //用户直接终止,返回空值
	}else{
		head = p;
		tail = p;     //当前只有一个结点,既是头也是尾
		tail->next = NULL; //尾结点的next域设为空
	}
	//循环创建其余结点
	while(true){
		p = (LLNode*) malloc(sizeof(LLNode));   //循环创建新结点并让p指向新结点
		scanf("%d", &(p->data));
		if(p->data == 0){
			break;
		}else{
			tail->next = p;   //将p指向的结点链接到尾巴后面
			tail = p;         //p变成了最后结点,所以tail指向p
			tail->next = NULL; //尾结点的next域设为空
		}
	}
	return head;
}

void printLinkList(LLNode *p){
	if(p==NULL) return;
	LLNode * q = p;
	printf("%d ", q->data);
	while(q->next != NULL){
		q = q->next;
		printf("%d ", q->data);
	}
	q=NULL;
	free(q);
}
int main(){
	LLNode * n = createLinkList();
	printLinkList(n);
	printf("\n");
	return 0;
}

 2.打印最大值结点,(循环遍历)

//查找最大结点
void printMaxNode(LLNode *p){
	if(p==NULL) return; //若p是空链表则返回空
	LLNode *max=p, *q=p; //指针max指向最大值结点,q为循环遍历指针
	while(q->next != NULL){ //有多个结点
		q = q->next;
		if(q->data>max->data) max=q; //让max始终指向最大值结点
	}
	//打印最大值结点value
	printf("%d", max->data);
	//清理内存
	max=q=NULL;
	free(max);
	free(q);
}

3.删除最大值结点

	void deleteMaxNode(LLNode *p) {  
		    if (p == NULL || p->next == NULL) {  
		        // 链表为空或只有一个节点,无需删除  
		        return;  
		    }  
		  
		    LLNode *max = p, *prev = NULL, *q = p;  
		    while (q != NULL) {  
		        if (q->data > max->data) {  
		            max = q;  
		            if (prev != NULL) { // 如果不是头节点,更新prev的next指针  
		                prev = q;  
		            }  
		        } else {  
		            prev = q;  
		        }  
		        q = q->next;  
		    }  
		  
		    // 如果最大值节点是头节点  
		    if (max == p) {  
		        p = max->next; // 更新头节点  
		    } else {  
		        prev->next = max->next; // 跳过最大值节点  
		    }  
		  
		    // 释放最大值节点的内存  
		    free(max);  
		}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值