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);
}