当前位置: 首页 > news >正文

c语言实现:链表创建、插入、删除、翻转

#include <stdio.h>
#include <stdlib.h>// 链表创建
typedef struct Node{int data;struct Node* next;
} Node;// 创建一个节点
Node* createNode(int data){Node* newNode = (Node* )malloc(sizeof(Node));newNode->data = data;newNode->next = NULL;return newNode;
}// 创建并插入一个节点
void insertNode(Node* head, int data){ // 要修改head得传入地址Node* insert = createNode(data);insert->next = head->next;head->next = insert;
}// 打印链表
void nodeListPrint(Node* head){int index = 0;head = head->next;while(head != NULL){printf("index: %d, head->data: %d\n", index, head->data);head = head->next;index ++;}
}// 根据data的值获取节点
Node* getNodeByData(Node* head, int data){while(head != NULL){if(head->data == data) return head;head = head->next;}printf("no wish node: %d\n", data);return NULL;
}// 根据data的值删除节点
void deleteNodeByData(Node* head, int data){Node* delete = getNodeByData(head, data);if(delete == NULL) return;while(head != NULL && head->next != delete) head = head->next;head->next = delete->next;delete->next = NULL;free(delete);
}// 链表翻转
void nodeListReverse(Node** head){Node* nodehead = *head; Node* oldhead = (*head)->next;Node* next = NULL;*head = NULL;while(oldhead != NULL){next = oldhead->next;oldhead->next = *head;*head = oldhead;oldhead = next;}nodehead->next = *head;*head = nodehead;
}int main(){Node* head = (Node* )malloc(sizeof(Node)); // 创建头节点for(int i = 1; i <= 10; i ++) insertNode(head, i);printf("1.完整链表如下:\n");nodeListPrint(head);printf("2.删除后的链表如下:\n");deleteNodeByData(head, 2);deleteNodeByData(head, 6);nodeListPrint(head);printf("3.链表翻转如下:\n");nodeListReverse(&head);nodeListPrint(head);printf("4.删除后的链表如下:\n");deleteNodeByData(head, 7);deleteNodeByData(head, 8);nodeListPrint(head);return 0;}

在这里插入图片描述

其中链表翻转也可以不用二阶指针,但是需要做返还在主函数要接收

// 链表翻转一阶指针
Node* nodeListReverse1(Node* head){Node* nodehead = head;Node* nhead = NULL;Node* next = NULL;head = head->next;while(head != NULL){next = head->next;head->next = nhead;nhead = head;head = next;}nodehead->next = nhead;nhead = nodehead;return nhead;
}

在这里插入图片描述
在这里插入图片描述
结果仍然是一样的

其他补充:

Makefile可以这样写:

runm: clean MAIN./MAINMAIN: main.ogcc -o MAIN main.omain.o: main.cgcc -c main.c -o main.oclean:rm -f *.o MAIN TESTrunt: clean TEST./TESTTEST: test.ogcc -o TEST test.otest.o: test.cgcc -c test.c -o test.o

优化后如下所示:

TRV1 = MAIN
TRV2 = TEST
TEP1 = main.o
TEP2 = test.o
ORG1 = main.c
ORG2 = test.crunm: clean $(TRV1)./$(TRV1)$(TRV1): $(TEP1)gcc -o $@ $<$(TEP1): $(ORG1)gcc -c $< -o $@clean:rm -f *.o MAIN TESTrunt: clean $(TRV2)./$(TRV2)$(TRV2): $(TEP2)gcc -o $@ $<$(TEP2): $(ORG2)gcc -c $< -o $@

http://www.mrgr.cn/news/36057.html

相关文章:

  • p2p、分布式,区块链笔记(OrbitDB.ControlCenter 003) :数据库接口 src\database\index.js
  • 设备程序驱动框架
  • 【Linux】解锁文件描述符奥秘,高效缓存区的实战技巧
  • MySQL: 数据类型介绍
  • 只要孩子感兴趣,学什么都不会白学
  • 如何根据拍立淘API返回值进行商品数据分析
  • USB-CAN的使用说明
  • QT开发模式(二):QML/JS/C++混合编程
  • 初识C#(二)- 流程控制
  • 微积分复习笔记(1):单变量微积分
  • 提取出来的ip与我原本的ip是在同一个区吗
  • Icarus翼星求生教你使用服务器开服
  • 鸿萌数据恢复:如何降低 RAM 故障风险,以避免数据丢失?
  • WebGL与Web Workers
  • 用于扩展 微软Azure OpenAI 服务工作负载的全球预置托管部署
  • USB Micro-A、Micro-B 插头与 Micro-AB、Micro-B 插座,及其引脚定义
  • 一文理解AXI4-lite与AXI4-stream协议
  • GEE APP:基于gee开发一个在线监测Landsat5、7、8的云量面积和百分比的可视化应用
  • 戏曲多多 1.0.6.0 专为电视端设计的戏曲与生活内容APP,同样适用于安卓手机,方便老年人使用
  • 如何在算家云搭建text-generation-webui(文本生成)