imoc 发表于 2021-8-13 18:30:39

数据结构里循环链表问题

看完就自己写了一个一次指令没有问题,但是同一个指令进行多次就出现段错误(例如插入和查找操作,进行一到两次没有问题,但是多试几组就会出现段错误){:10_285:} ,想请大神给小白解惑
以下是代码:
#include<stdio.h>
typedef struct Cir_list
{
        int date;
        struct cir_list *next;
}cir_list;
int main()
{
        cir_list *the_head=NULL;
        int instrust;
    printf("1:初始化单链表\n");
    printf("2:插入元素\n") ;
    printf("3:删除元素\n");
        printf("4:查找元素位置\n");
        printf("5:打印所有数据\n");
        printf("-1:退出程序\n");
        while(1)
        {
                scanf("%d",&instrust);
                switch(instrust)
                {
                        case 1:setup(&the_head);break;
                        case 2:insert(the_head,&the_head);break;
                        case 3:del_target(&the_head);break;
                        case 4:lookfor(the_head);break;
                        case 5:print_list(the_head);break;
                        case -1:free_list(the_head);return 0;
                }
        }

}
void setup(cir_list **the_head)
{
        int num;
        cir_list *temp,*target;
        int i=0;
        printf("输入数据(0表示初始化结束)");
        while(1)
        {
                scanf("%d",&num);
                temp=(cir_list *)malloc(sizeof(cir_list));
                temp->date=num;
                if(num!=0)
                {
                        if(i==0)
                        {
                                *the_head=temp;
                                temp->next=*the_head;
                                i++;
                        }
                        else
                        {
                                for(target=*the_head;target->next!=*the_head;target=target->next);
                                target->next=temp;
                                temp->next=*the_head;                       
                        }       
                               
                }
                else {printf("初始化完成,请进行下一步操作/n");break;}
       }
       return;
}
void insert(cir_list*the_head,cir_list **The_head)
{
        int num,i,j=1;
        cir_list *temp,*target;
        printf("请输入需要插入的数据:");
        scanf("%d",&num);
        printf("请输入插入位置:");
        scanf("%d",&i);
        target=(cir_list*)malloc(sizeof(cir_list));
        target->date=num;
        if(i==1)
        {
               target->next=*The_head;
               *The_head=target;
        }
        else
        {
                for(temp=the_head;j<i-1;j++)
                {
                        temp=temp->next;
                }
                target->next=temp->next;
                temp->next=target;
        }
        printf("插入成功/n");
        return;       
}
void del_target(cir_list **the_head)
{
   int m;
   cir_list *temp;
   cir_list *p,*q;
   printf("请输入需要删除的数据:");
   scanf("%d",&m);
   if((*the_head)->date==m)
   {
           for(p=*the_head;p->next!=*the_head;p=p->next);
           temp=*the_head;
           *the_head=(*the_head)->next;
           p->next=*the_head;
           free(temp);
   }
   else
   {
           for(p=*the_head,q=(*the_head)->next;q->date!=m&&p->next!=*the_head;p=p->next,q=q->next);
           if(p->date!=m&&p->next==*the_head) printf("无此元素/n");
           else
           {
                   temp=p->next;
                   p->next=temp->next;
                   free(temp);
                   printf("删除成功/n");
                }
   }
}
void lookfor(cir_list *the_head)
{
        int target;
       printf("请输入需要查找的数据:");
        scanf("%d",&target);
        cir_list *temp;
        int j=1;
        temp=the_head;
        while(1)
       {
               if(temp->date!=target&&temp->next!=the_head)
                 {
                         temp=temp->next;
                  j++;
                        }
                else break;
       }
                if(temp->next=the_head&&temp->date!=target)
                {
                        printf("无此元素\n");
                        return;
                }
        else printf("%d",j);
}
void print_list(cir_list *the_head)
{
        cir_list *temp=the_head;
        for(;temp->next!=the_head;temp=temp->next)
        {
                printf("%d ",temp->date);
       }
       printf("%d",temp->date);
}
void free_list(cir_list *the_head)
{
        cir_list *temp,*mid;
        temp=the_head;
        for(;temp->next!=the_head;temp=temp->next)
        {
                mid=temp;
                temp=mid->next;
                free(mid);
       }
       return;
        }

imoc 发表于 2021-8-13 18:32:15

{:5_111:}
页: [1]
查看完整版本: 数据结构里循环链表问题