移动链表节点

给定带有表头结点的单向链表,编写一个函数,将链表中偶数序号的数据节点移到链尾。

链表节点的结构定义:

typedef struct numLink

{

int no;

struct numLink *next;

}NODE;

所编写函数的原型:void movenode( NODE *head)

其中:参数head 是单向链表的头指针。

输入:节点数目

输出:处理后的结果

说明:仅提交函数 void movenode( NODE *head) 即可。

预设代码

前置代码

view plainprint?

  1. /* PRESET CODE BEGIN - NEVER TOUCH CODE BELOW */  
  2. #include <stdio.h>  
  3. #include <stdlib.h>  
  4.   
  5. typedef struct numLink  
  6. {  
  7.     int no;  
  8.     struct numLink *next;  
  9. }NODE;  
  10.   
  11. void movenode( NODE *head);  
  12.   
  13. void SetLink( NODE *h, int n )  
  14. {  
  15.     NODE *p=NULL, *q=NULL;  
  16.     int i;  
  17.     for( i=0; i<n; i++)  
  18.     {  
  19.         p = (NODE *)malloc(sizeof(NODE));  
  20.         p->no = i+1;  
  21.         p->next = NULL;  
  22.         if( h->next == NULL )  
  23.         {  
  24.   
以下是链表节点移动操作的C语言代码: ```c // 头文件 #include <stdio.h> #include <stdlib.h> // 定义链表节点 typedef struct node { int data; struct node *next; } Node; // 定义链表节点 typedef struct { Node *head; } List; // 初始化链表 void init(List *list) { list->head = NULL; } // 添加节点链表末尾 void append(List *list, int data) { Node *node = (Node*) malloc(sizeof(Node)); node->data = data; node->next = NULL; if (list->head == NULL) { list->head = node; } else { Node *temp = list->head; while (temp->next != NULL) { temp = temp->next; } temp->next = node; } } // 删除节点 void remove_node(List *list, int data) { Node *temp = list->head; Node *prev = NULL; while (temp != NULL) { if (temp->data == data) { if (prev == NULL) { list->head = temp->next; } else { prev->next = temp->next; } free(temp); break; } else { prev = temp; temp = temp->next; } } } // 移动节点 void move_node(List *list, int data, int distance) { Node *temp = list->head; Node *prev = NULL; while (temp != NULL) { if (temp->data == data) { if (prev == NULL) { list->head = temp->next; temp->next = list->head; list->head = temp; } else { prev->next = temp->next; temp->next = prev->next; prev->next = temp; } for (int i = 0; i < distance; i++) { if (temp->next == NULL) { break; } Node *next = temp->next; temp->next = next->next; next->next = temp; prev->next = next; prev = next; } break; } else { prev = temp; temp = temp->next; } } } // 输出链表 void print_list(List *list) { Node *temp = list->head; while (temp != NULL) { printf("%d ", temp->data); temp = temp->next; } printf("\n"); } // 测试函数 int main() { List list; init(&list); append(&list, 1); append(&list, 2); append(&list, 3); append(&list, 4); append(&list, 5); printf("原链表:"); print_list(&list); move_node(&list, 3, 2); printf("移动节点后的链表:"); print_list(&list); return 0; } ``` 注意:此代码仅供参考,具体实现可能需要根据实际情况进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值