C-实现循环列表以及如何在列表中删除中间节点


#include <stdio.h>
#include <stdlib.h>
struct cir{
    int info;
    struct cir* next;
};
struct cir* create(int num){
    struct cir* temp;
    temp=(struct cir*)malloc(sizeof(struct cir));
    temp->info=num;
    temp->next=NULL;
    return(temp);
}

struct cir* insertlast(struct cir** head0, struct cir* new1){
    struct cir* temp;
    temp=(*head0);
    if(temp==NULL){
        new1->next=new1;
        return(new1);
    }
    else{
        while(temp->next !=(* head0) ){
            temp=temp->next;
        temp->next=new1;
        new1->next=(*head0) ; }
    }
    return(*head0);
}
void vizualize(struct cir* head0){
    struct cir* temp;
    temp=head0;
    printf("Lista:");
    while(head0->next != temp ){
        printf("[%d]-->", head0->info);
        head0 =head0 ->next;
    }
    printf("%d(testa)", head0->info);

}
int main(){
    struct cir* head;
    int i,n1,n2;
    struct cir* new1;

    printf("Insert the number of elements you want to put in  the list:nn");
    scanf("%d", &n1);
    for(i=0;i<n1;i++){
        printf("Insert the element you want to insert in the list:nn");
        scanf("%d", &n2);
        new1=create(n2);
        insertlast(&head,new1);
    }
    vizualize(head);
}

嗨!我已经编写了此代码以实现圆形列表,但是当我尝试运行它崩溃的代码时。

我已经创建了函数struct cir* create(int num)来创建一个单个元素,以通过调用函数struct cir* insertlast(struct cir** head0, struct cir* new1来攻击循环列表中的函数列表中的单个元素。

此外,作为双向列表的重述:

 if(temp->next!=NULL){
        (temp->next)->prev=NULL;

什么是

(temp->next)->prev=NULL;

做?

最后一个问题,是否有人可以在这里编写一个代码来删除单向列表中间的元素?我已经尝试过任何方式,但是每次尝试删除一个元素,程序m崩溃或列表以相同的方式进行了vizalize!

非常感谢!

ps.从列表中删除和提取元素之间的区别?

这将有效:

#include <stdio.h>
#include <stdlib.h>
struct cir {
    int info;
    struct cir* next;
};
struct cir* create(int num) {
    struct cir* temp;
    temp = (struct cir*)malloc(sizeof(struct cir));
    temp->info = num;
    temp->next = NULL;
    return(temp);
}

struct cir* insertlast(struct cir* head0, struct cir* new1) {
    struct cir* last;
    if ( head0 == NULL ) {
        new1->next = new1;
        return new1;
    }
    else {
        last = head0;
        while (last->next != head0) {
            last = last->next;
        }
        last->next = new1;
        new1->next = head0;
        return head0;
    }
}
void vizualize(struct cir* head0) {
    struct cir* temp;
    if (head0) {
        temp = head0;
        printf("List:");
        do {
            printf("[%d]-->", temp->info);
            temp = temp->next;
        } while ( temp != head0 );
    }
}
int main() {
    struct cir* head;
    int i, n1, n2;
    struct cir* new1;
    head = 0;
    printf("Insert the number of elements you want to put in  the list:nn");
    scanf("%d", &n1);
    for (i = 0; i < n1; i++) {
        printf("Insert the element you want to insert in the list:nn");
        scanf("%d", &n2);
        new1 = create(n2);
        head = insertlast(head, new1);
    }
    vizualize(head);
}

只是注意,我已经在C 编译器上进行了测试,而不是C。

这是删除和提取元素之间的区别 从列表中?

提取物表示您从列表中删除元素并可以使用它。删除意味着您不仅要从列表中删除,还要从列表中删除。

问题是插入函数。第一个问题是何时插入并且列表为空(您还忘记了在主机中初始化null的头部),因为您只是为新元素设置了"下一个"指针,而不会使其成为新元素列表。
然后,当滚动浏览列表时,您写的方式是在循环时,循环直到找到插入点,然后退出而无需实际做任何事情。

这里是该函数的校正工作版本:

struct cir* insertlast(struct cir** head0, struct cir* new1) {
    struct cir* temp;
    temp = (*head0);
    if(temp == NULL) {
        new1->next = new1;
        *head0 = new1;
        return(*head0);
    }
    else {
        while(temp->next != (*head0)) {
            temp = temp->next;
        }
        temp->next = new1;
        new1->next = (*head0);
    }
    return(*head0);
}

关于

的含义
(temp->next)->prev=NULL;

在双向列表中,它将"临时"指向的节点设置为null,因为从" temp"中,您转到下一个元素,然后再次转到上一个元素,这与开始相同(给出了那个开始(给定)正确设置了下一个"one_answers" prev")。

最后,要从单向列表中删除元素,您必须在要删除和重新排列指针之前就停止元素:

while(temp->next->info != target){
      temp=temp->next
}
struct circ* node_to_delete = temp->next;
temp->next = node_to_delete->next;
free(node_to_delete);

我认为提取和删除之间没有明确的差异,但是通常我会考虑提取时只能从列表中删除元素时提取。

相关内容

  • 没有找到相关文章

最新更新