#include
#include
typedef struct node{
int data;
struct node* next,*prior;
}*linklist,node;
void createlist(linklist &l,int n){
linklist r=l;
l->data=1;
for(int i=2;i<=n;i++){
linklist p=(linklist)malloc(sizeof(node));
p->prior=r;
p->next=l;
p->data=i;
l->prior=p;
r->next=p;
r=p;
}
}
void deletelinklist(linklist &l,linklist &p,int m,int k,int n){
for(int j=1;j<=n;j++){
if(j%2!=0){
for(int i=1;ip=p->prior;
}
printf("%d ",p->data);
free(p);
}
else{
for(int j=1;jp=p->next;
}
printf("%d ",p->data);
free(p);
}
}
}
int main(){
linklist l=(linklist)malloc(sizeof(node));
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
createlist(l,n);
linklist p=l;
deletelinklist(l,p,m,k,n);
return 0;
}
在你的 deletelinklist 函数中,你正确地释放了 p 节点,但在释放它之前,你需要更新其相邻节点的 next 和 prior 指针,这样链表就不会断裂。在释放节点后,还需要将 p 更新为相邻的一个节点,以便继续循环操作。以下是修复后的代码:
尝试下面这个代码:
void deletelinklist(linklist &l,linklist &p,int m,int k,int n){
for(int j=1;j<=n;j++){
if(j%2!=0){
for(int i=1;i<m;i++){
p=p->prior;
}
printf("%d ",p->data);
// Update the next and prior pointers of the adjacent nodes
p->prior->next = p->next;
p->next->prior = p->prior;
// Store the address of the prior node before freeing p
linklist nextNode = p->prior;
free(p);
// Update p to the next node
p = nextNode;
} else {
for(int j=1;j<k;j++){
p=p->next;
}
printf("%d ",p->data);
// Update the next and prior pointers of the adjacent nodes
p->prior->next = p->next;
p->next->prior = p->prior;
// Store the address of the next node before freeing p
linklist nextNode = p->next;
free(p);
// Update p to the next node
p = nextNode;
}
}
}
修改如下,供参考:
#include<stdio.h>
#include<malloc.h>
typedef struct node{
int data;
struct node* next,*prior;
}*linklist,node;
void createlist(linklist &l,int n){
linklist r=l;
l->data=1;
for(int i=2;i<=n;i++){
linklist p=(linklist)malloc(sizeof(node));
p->prior=r;
p->next=l;
p->data=i;
l->prior=p;
r->next=p;
r=p;
}
}
void deletelinklist(linklist &l,int m,int k,int n){ //修改
linklist p = NULL;
for(int j=1;j<=n;j++){
if(j%2!=0){
for(int i=1;i<m;i++){
l=l->prior;
}
printf("%d ",l->data);
p = l; //修改
l=l->prior; //修改
}
else{
for(int j=1;j<k;j++){
l=l->next;
}
printf("%d ",l->data);
p=l; //修改
l=l->next; //修改
//free(p); 修改
}
p->next->prior = p->prior;//修改
p->prior->next = p->next; //修改
free(p); //修改
}
}
int main(){
linklist l=(linklist)malloc(sizeof(node));
int n,m,k;
scanf("%d %d %d",&n,&m,&k);
createlist(l,n);
//linklist p=l;
deletelinklist(l,m,k,n); //修改
return 0;
}