鱼C论坛

 找回密码
 立即注册
查看: 1453|回复: 1

数据结构里循环链表问题

[复制链接]
发表于 2021-8-13 18:30:39 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
看完就自己写了一个一次指令没有问题,但是同一个指令进行多次就出现段错误(例如插入和查找操作,进行一到两次没有问题,但是多试几组就会出现段错误) ,想请大神给小白解惑
以下是代码:
#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;
        }
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2021-8-13 18:32:15 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 01:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表