链表题_2

本文详细介绍了单链表的基本操作,包括约瑟夫环、逆置/反转、排序(冒泡排序、快速排序)、合并有序链表、查找中间节点及倒数第k个节点等实用技巧。

typedef int Data;
typedef struct List
{
Data arrary;
struct List* next;
}List;


List* BuyList(Data x)
{
List* node = (List*)malloc(sizeof(List));
node->next = NULL;
node->arrary = x;
return node;
}

void PushFront(List** pphead,Data x)
{
if ((*pphead) == NULL)
{
*pphead = BuyList(x);
}
else
{
List* start = *pphead;
start = BuyList(x);
start->next = *pphead;
*pphead = start;
}
}

1.单链表实现约瑟夫环

void JosephList(List**pphead)
{
List* end = *pphead;
while (end->next!=NULL)
{
end = end->next;
}
end -> next = *pphead;
}

2.逆置/反转单链表

void Reveaslist_R(List** pphead)
{
List* start = BuyList((*pphead)->arrary);
List* cur = *pphead;
while (cur->next != NULL)
{
cur = cur->next;
PushFront(&start,cur->arrary);
}
*pphead = start;
}

3.单链表排序(冒泡排序)

void BubbleSort(List** pphead)
{
int count = 0;
List* start = NULL;
List* cur = *pphead;
while (cur)
{
count++;
cur = cur->next;
}
while (count > 0)
{
start = *pphead;
while (start->next != NULL)
{
if (start->arrary > start->next->arrary)
{
int tmp = start->arrary;
start->arrary = start->next->arrary;
start->next->arrary = tmp;
}
start = start->next;
}
count--;
start = (*pphead);
}
*pphead = start;
}

4.单链表排序(快速排序)

void SortList(List** pphead)
{
List* first = *pphead;
List* second = NULL;
while (first->next != NULL)
{
second = first->next;
while (second)
{
if (second->arrary < first->arrary)
{
Data tmp = second->arrary;
second->arrary = first->arrary;
first->arrary = tmp;
}
second = second->next;
}
first = first->next;
}
}

5.合并两个有序链表,合并后依然有序

void MergeList(List** pphead, List** pphead1)
{
List* Start = *pphead;
List* cur = Start;
while (Start->next)
{
Start = Start->next;
}
Start->next = *pphead1;
*pphead = cur;
SortList(pphead);
}

6.查找单链表的中间节点,要求只能遍历一次链表

void FindMidfList(List* phead)
{
List* fast = phead;
Data tmp;
List* slow = phead;
while ((fast != NULL) && (fast->next != NULL))
{
tmp = slow->arrary;
slow = slow->next;
fast = fast->next->next;
    }
if (fast == NULL)
{
printf("中间节点所存储的数据为:%d %d\n",tmp,slow->arrary);
}
else if(fast->next == NULL)
{
printf("中间的节点所存储的数据为:%d \n", slow->arrary);
}
}

7.查找单链表的倒数第k个节点,要求只能遍历一次链表

void Find_List(List* phead,Data n)
{
List* fast = phead;
List* slow = phead;
Data a = n - 1;
while (fast->next != NULL)
{
while (a > 0)
{
fast = fast->next;
a--;
}
if (fast->next == NULL)
{
break;
}
slow = slow->next;
fast = fast->next;
}
printf("倒数第%d个节点的数据是:%d \n", n, slow->arrary);
}

【从高压输电线的架空地线中汲取电能】一个25千瓦受控电源从735千伏线路的架空地线中汲取电能的SimPowerSystems模型(Simulink仿真实现)内容概要:本文介绍了一个基于SimPowerSystems的Simulink仿真模型,用于模拟从735千伏高压输电线的架空地线中汲取25千瓦电能的受控电源系统。该模型聚焦于高压输电线路中架空地线的能量回收技术,通过仿真手段实现对电能采集过程的建模与控制策略验证,体现了电力系统中新型能源获取方式的技术可行性与工程应用潜力。文中还提及该资源属于一系列电力系统仿真研究的一部分,涵盖微电网、储能优化、碳流追踪、鲁棒调度等多个前沿方向,配套提供Matlab/Simulink代码及网盘资料链接,便于科研人员复现与拓展研究。; 适合人群:具备电力系统基础知识、熟悉Matlab/Simulink仿真环境,从事电力工程、能源回收或智能电网相关研究的科研人员及研究生;有一定编程与建模仿真经验的高年级本科生或工程技术人员。; 使用场景及目标:①研究高压输电线路中架空地线的能量回收机制与建模方法;②掌握基于Simulink的电力系统仿真技术,特别是受控电源与电网交互的动态特性分析;③为开展能源 harvesting、分布式供能、电力电子变换器控制等相关课提供参考模型与技术支撑; 阅读建议:建议结合提供的仿真模型文件进行实操演练,重点理解系统结构设计、参数设置与控制逻辑实现;同时可延伸学习文档中提到的其他电力系统优化与仿真案例,以拓宽研究视野和技术积累。
### 链表数据结构练习 以下是关于链表的一些经典练习目及其解析: #### 计算链表长度 为了计算链表的长度,可以通过遍历整个链表并计数节点的数量来实现。具体方法是从头节点出发,逐步移动指针直到到达链表末尾[^2]。 ```c int getLength(struct Node* head) { int count = 0; struct Node* current = head; while (current != NULL) { count++; current = current->next; } return count; } ``` #### 删除指定值的所有节点 删除链表中所有等于给定值 `val` 的节点是一个常见的操作。此过程涉及调整前驱节点和后继节点之间的链接关系[^3]。 ```c struct Node* removeElements(struct Node* head, int val) { struct Node dummy = {0}; dummy.next = head; struct Node *prev = &dummy, *curr = head; while (curr != NULL) { if (curr->data == val) { prev->next = curr->next; free(curr); curr = prev->next; } else { prev = curr; curr = curr->next; } } return dummy.next; } ``` #### 创建图书信息链表 可以设计一个包含图书信息(书号、书名、价格)的链表,并通过输入相应数据完成链表的构建。之后还可以统计链表中的图书数量以及逐行打印每本书的信息[^4]。 ```c typedef struct BookNode { char id[20]; char name[50]; float price; struct BookNode* next; } BookNode; BookNode* createBook(char id[], char name[], float price) { BookNode* newNode = malloc(sizeof(BookNode)); strcpy(newNode->id, id); strcpy(newNode->name, name); newNode->price = price; newNode->next = NULL; return newNode; } void addBook(BookNode** headRef, BookNode* newBook) { if (*headRef == NULL) { *headRef = newBook; } else { BookNode* temp = *headRef; while (temp->next != NULL) { temp = temp->next; } temp->next = newBook; } } void printBooks(BookNode* head) { BookNode* current = head; while (current != NULL) { printf("ID: %s, Name: %s, Price: %.2f\n", current->id, current->name, current->price); current = current->next; } } ``` ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值