解题思路:
其实,后移对于链表来说 只需要让头节点顺着前驱向前移动便可
改变了头节点得位置之后 从当前头结点顺序往后输出
注意事项:
参考代码:#include <stdio.h>
#include <stdlib.h>
typedef struct NODE{
int value;
struct NODE *previous,*next;
}node;
//函数声明
node *create();
void output(node *head);
void freeNode(node *head);
node *swapHead(node *head,int n);
node *input();
//主函数
int main(){
int n;
node *head=NULL;
head=input();
scanf("%d",&n);
head=swapHead(head,n);
output(head);
//system("pause");
freeNode(head);
return 0;
}
//接收数值
node* input(){
node *temp,*head=NULL;
int n ,value;
scanf("%d",&n);
while (n--)
{
scanf("%d",&value);
if (head) //如果头节点非空
{
temp->next=create(); //临时节点后继指向新节点
temp->next->previous=temp; //临时节点后继(新节点)的前驱指向前节点
temp=temp->next;//后移至新节点
head->previous=temp; //头前驱指向新节点
temp->next=head; //新节点后继指向头节点 形成循环链表
temp->value=value; //新节点赋值
}else{ //否则头节点为空(初始情况)的情况下对头结点赋值
head=create();
temp=head;
head->value=value;
}
}
return head;
}
//交换头
node * swapHead(node *head,int n){
while (n--) //如果n不为空 执行循环并自减1
{
head=head->previous; //头节点顺着前驱前移
}
return head;
}
//创建
node * create(){
node *add=NULL;
add=(node*)malloc(sizeof(node)); //申请空间
//初始化
add->value=0;
add->previous=NULL;
add->next=NULL;
return add;
}
//打印
void output(node *head){
node *temp=head;
do{
// printf("%d %p<-%p->%p\n",temp->value,temp->previous,temp,temp->next);
printf("%d ",temp->value);
temp=temp->next;
}while (temp!=head); //先打印头 然后临时节点往后走 如果没有走回头就继续循环 否则退出循环
}
//释放
void freeNode (node *head){
node *temp,*current=head;
while (current->next!=head)
{
current=current->next;
free(current->previous);
current->previous=NULL;
}
free(current);
current=NULL;
}
0.0分
0 人评分
C语言训练-求素数问题 (C语言代码)浏览:1509 |
九宫重排 (C++代码)浏览:1410 |
C语言程序设计教程(第三版)课后习题1.5 (C语言代码)浏览:504 |
C语言程序设计教程(第三版)课后习题8.5 (C语言代码)浏览:956 |
C语言程序设计教程(第三版)课后习题9.4 (C语言代码)浏览:699 |
用筛法求之N内的素数。 (C语言代码)浏览:711 |
图形输出 (C语言代码)浏览:1422 |
前10名 (C语言代码)浏览:773 |
C语言程序设计教程(第三版)课后习题11.3 (C语言代码)浏览:662 |
简单的a+b (C语言代码)浏览:617 |