#include<stdio.h> #include<stdlib.h> typedef struct List{ int data; struct List *next; }list; list *InitList(list *l) { l=(list*)malloc(sizeof (list)); l->next=NULL; return l; } void createList(list *l,int n) { l->data=1; l->next=NULL; list *rear=l; int i=2; for(i;i<=n;i++) { list *p=(list*)malloc(sizeof(list)); p->data=i; p->next=NULL; rear->next=p; rear=p; } rear->next=l; } void specialCreateList(list *l,int n,int a[n]) { l->data=a[0]; list *rear=l; int i=1; for(i;i<n;i++) { list *p=(list*)malloc(sizeof(list)); p->data=a[i]; p->next=NULL; rear->next=p; rear=p; } rear->next=l; } void printfList(list *l,int m) { if(m>=2) { int i=2; list *q=l; while(q->next!=q) { for(i;i<m;i++) q=q->next; list *p=q->next; printf("%4d",p->data); q->next=p->next; free(p); i=2; q=q->next; } printf("%4d",q->data); } else if(m==1) { while(l->next!=l) { list *p=l; printf("%4d",p->data); l=l->next; free(p); } printf("%4d",l->data); } } void giveList(list *l,int m,int n,int a[n]) { if(m>=2) { int i=2; list *q=l; // int a[n]; int j=0; while(q->next!=q) { for(i;i<m;i++) q=q->next; list *p=q->next; a[j]=p->data; j++; q->next=p->next; free(p); i=2; q=q->next; } a[n-1]=q->data; } else if(m==1) { int j=0; while(l->next!=l) { list *q=l; a[j]=q->data; l=l->next; free(q); j++; } a[n-1]=l->data; } } int main() { int m,n,k; scanf_s("%d %d %d",&n,&m,&k); int a[n]; list *l= InitList(l); createList(l,n); giveList(l,m,n,a); list *b=InitList(b); specialCreateList(b,n,a); printfList(b,k); return 0; }找出这段代码的问题并修改
时间: 2024-04-21 21:28:15 浏览: 56
C语言头文件 LIST.H
这段代码实现了约瑟夫环问题,但是存在以下问题:
1. `InitList(list *l)` 函数中传入的指针没有使用,应该改为传入一个空指针,函数内部申请内存并返回该指针。
2. `createList(list *l,int n)` 函数中,当链表为空时,应该将第一个节点的值设为1,否则链表中没有1。
3. `specialCreateList(list *l,int n,int a[n])` 函数中,当链表为空时,应该将第一个节点的值设为 `a[0]`。
4. `printfList(list *l,int m)` 函数中,当 `m==1` 时,缺少对只有一个节点的情况的处理,应该直接输出该节点的值。
修改后的代码如下:
阅读全文