C I';我正在制作一个必须交换的链表';s指令
我正在写一个使用双链表的程序。首先,它从输入中获取2个数字。第二个数字将在以后使用,但第一个数字n在函数中用于排列链表,使其从n变为1,如n->n-1->n-2->…->1,同时使用next或prev在节点之间移动。然后另一个函数获取相同的链表并交换它,使它从1变为'n',但我不知道如何让它交换。我更改或尝试的所有内容要么显示为分段错误,要么返回相同的列表而不做任何更改。此外,这是我第一次使用这个网站来解决我在编码方面遇到的任何问题,所以如果我做错了什么,请告诉我,这样我就可以避免犯任何错误 这是我计算机科学1课的家庭作业,预计于2019年10月25日完成。我只是需要代码的帮助,因为代码给了我无法修复的问题C I';我正在制作一个必须交换的链表';s指令,c,linked-list,doubly-linked-list,C,Linked List,Doubly Linked List,我正在写一个使用双链表的程序。首先,它从输入中获取2个数字。第二个数字将在以后使用,但第一个数字n在函数中用于排列链表,使其从n变为1,如n->n-1->n-2->…->1,同时使用next或prev在节点之间移动。然后另一个函数获取相同的链表并交换它,使它从1变为'n',但我不知道如何让它交换。我更改或尝试的所有内容要么显示为分段错误,要么返回相同的列表而不做任何更改。此外,这是我第一次使用这个网站来解决我在编码方面遇到的任何问题,所以如果我做错了什么,请告诉我,这样我就可以避免犯任何错误 这
typedef struct nod{
int data;
struct nod *next;
struct nod *prev;
}soldier;
soldier *head = NULL;
soldier* create_soldier (int sequence);
soldier* create_reverse_circle(int n);
soldier* rearrange_circle(soldier *head);
void display(soldier *head);
int kill(soldier* head, int n, int k);
//dynamically allocates a solider node
soldier* create_soldier (int sequence){
soldier *temp = (soldier *)malloc(sizeof(soldier));
temp->data = sequence;
temp->next = NULL;
temp->prev = NULL;
return temp;
}
//creates a list of soliders from n to 1
soldier* create_reverse_circle(int n){
soldier *temp = NULL;
soldier *t = NULL;
int i;
//printf("w");
for(i = n; i > 0; i--){
temp = create_soldier(i);
if(head==NULL){
head=temp;
temp->next=head;
}
else{
t=head;
t->prev = t;
while(t->next!=head){
t=t->next;
}
t->next=temp;
temp->prev = t;
temp->next=head;
}
}
return head;
}
//rearranges the soliders in the list to go from 1 to n
//the function I am having issues with
soldier* rearrange_circle(soldier* head){
soldier *t = (soldier *)malloc(sizeof(soldier));
soldier *temp = NULL;
soldier *exc = head;
int h = 0;
int k = 1;
//printf("\ntest 1:"); for test purposes
while(exc != head){
//tamp->data = k;
temp = exc;
temp->next = exc->prev;
temp->prev = exc->next;
if(h != 1){
head = temp;
temp->next = head;
h = 1;
}
else{
t = head;
while(t->next != head)
t=t->next;
t->next = temp;
temp->prev = t;
head->next = t->next;
temp->next = head;
}
exc = exc->next;
temp = temp->next;
//k++;
}
//printf("h = %d\n", h); also for test purposes
return head;
}
//displays the head of the list
void display(soldier* head){
soldier *temp=head;
while(temp->next != head){
printf("%d->", temp->data);
temp = temp->next;
}
printf("%d", temp->data);
}
假设用户输入2个数字。第一个数字n决定循环,第二个数字k将在以后使用。第一个函数,create_reverse_circle,应该取n,并将一个从n到1的双链表返回给main函数,以便在display函数中打印出来。然后,另一个函数,Reaginate_circle,获取该链表,颠倒顺序,使其从1变为n,并将其返回到主函数,以便在显示函数中再次打印(如果没有分段错误,则只打印第一次打印的相同结果)。交换列表后,由于已解决该问题而忽略的int函数应使用链表N和第二个数字K删除函数中的所有其他节点,直到K+1剩余,并返回该值以打印在主列表中。基于此,您可以通过以下方式反转列表:
/* Function to reverse a Doubly Linked List */
void reverse(soldier **head_ref)
{
soldier *temp = NULL;
soldier *current = *head_ref;
/* swap next and prev for all nodes of
doubly linked list */
while (current != NULL)
{
temp = current->prev;
current->prev = current->next;
current->next = temp;
current = current->prev;
}
/* Before changing the head, check for the cases like empty
list and list with only one node */
if(temp != NULL )
*head_ref = temp->prev;
}
请注意,它不会生成一个被反转的新列表,而是以破坏性方式获取列表并将其反转,为此,您需要向其传递一个指向“指向头部的指针”的指针,然后您可以在“指向头部的指针”中获得结果(必须与传递的指针相同)。
但是,如果您希望将原始列表保留为一个整体,则可以先复制整个列表,然后反转新列表。
复制列表的代码,基于:
你好欢迎来到堆栈溢出。你当然没有落入没有提供足够信息的陷阱!试着阅读。这篇文章有几个特别的提示:只提供足够的信息来引起问题。重写你的程序,只包含引起你的错误的最小值。同时,给出该程序给出的具体错误。它是不是颠倒了,或者您是否遇到了分段错误?谢谢您的帮助。它让我知道我做错了什么。
soldier *copy(soldier *start1)
{
if(start1==NULL) return;
soldier *temp=(soldier *) malloc(sizeof(soldier));
temp->prev=start1->prev;
temp->data=start1->data;
temp->next=copy(start1->next);
return temp;
}