m0_75048134 2023-06-15 19:55 采纳率: 100%
浏览 15
已结题

关于数据结构链表c语言

#初始化有问题导致查找,插入,输出都不行,救命救命明天就交了球球帮忙改一改吧


#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#define MAXN 1000
typedef struct workers //线性表链式存储结构的定义
{
    char sid[10];    //编号 
    char name[10];    //姓名 
    char gender[10];   //性别 
    char birth[6];    //出生年月 
    char edu[30];    //学历 (education的缩写) 
    char duty[30];   //职务 
    char number[30];   //电话 
    char add[50];     //住址 
    struct workers*next;
}Node,*LinkList;

LinkList InitList(LinkList *S);
LinkList CreateLinkList(int n);   // //带n个节点的链表,返回链表的头指针
int InsList(LinkList S, int i);//插入信息 
int DelList(LinkList S,int i);//删除信息 
int update(LinkList h);    //更新信息
void search(LinkList h);   //查询信息 
void Output1(LinkList S);   //输出1
void Output2(LinkList S);   //输出表格 
void select(int option,LinkList S);     //选择函数 
 

typedef int ElemType; //数据元素类型定义




//主函数 
int main(void){
 int option;
    //显示菜单 
 LinkList S= (LinkList) malloc(sizeof(Node));
 while(1){
 printf("-----欢迎使用员工管理系统-----\n"); 
 printf("[1]输入信息\n");
 printf("[2]查询信息\n"); 
 printf("[3]更新信息\n");
 printf("[4]插入信息\n");
 printf("[5]删除信息\n");
 printf("[6]输出表格\n"); 
 printf("[7]退出系统\n");
 printf("\n");
 printf("请输入您的选择:");
    scanf("%d",&option);
     if(option==7){
      break;
     }else if(option>7||option<=0){
      printf("输入错误!\n"); 
     }else if(option>=1&&option<=7){
      select(option,S);     //根据选项调用函数 
     }
    }
}
void select(int option,LinkList S)
{
    
    int i,j;
    char a[10],x[10];
    switch(option)
    {
       case 1:
       int n;
       printf("创建线性表操作.\n");
       printf("请输入你要创建线性表的长度:\n");
       scanf("%d",&n);
       S = CreateLinkList(n);    
       break;
       case 2:
       search(S);
       break;
       case 3:
       update(S);
       break;
       case 4:
       printf("请输入插入的位置:");
       scanf("%d",&i);
       InsList(S,i);
       break;
       case 5:
       printf("请输入删除的位置:");
       scanf("%d",&j);
       DelList(S,j); 
       break;
       case 6:
       Output2(S);
       break;
       case 7:
       printf("\n谢谢使用,再见!\n");
       break;
       default:
       printf("\t输入错误,请重新输入\n");    
    }
}
 


int update(LinkList h){
    char s[10];
    LinkList p;
    p=h->next;
    printf("请输入要查找的编号:");
    scanf("%s",&s); 
    if(!p){
        return 0;
    }else{
        while(p&&p->sid!=s){
            p=p->next;
        }
        if(!p){
            return 0;
        }else{
            printf("请输入要更新的姓名:\n");
            scanf("%s",&p->name); 
            printf("请输入要更新的性别:\n");
            scanf("%s",&p->gender); 
            printf("请输入要更新的出生年月:\n");
            scanf("%s",&p->birth); 
            printf("请输入要更新的学历:\n");
            scanf("%s",&p->edu); 
            printf("请输入要更新的职务:\n");
            scanf("%s",&p->duty); 
            printf("请输入要更新的电话:\n");
            scanf("%s",&p->number); 
            printf("请输入要更新的住址:\n");
            scanf("%s",&p->add); 
            return 1;
        }
    }
    
}


void search(LinkList h){
    int x;
    char si[10];    //编号 
    char na[10];    //姓名 
    char bi[6];    //出生年月 
    char ed[30];    //学历 
    char du[30];   //职务 
    char nu[30];   //电话 
    char ad[50];    //住址 
    LinkList p;
    p=h;
    printf("[1]编号\n");
    printf("[2]姓名\n");
    printf("[3]出生年月\n");
    printf("[4]学历\n");
    printf("[5]职务\n");
    printf("[6]电话\n");
    printf("[7]住址\n");
    printf("请输入你要查询的信息:\n");
    scanf("%d",&x);
    
    switch(x){
        case 1:
        printf("请输入你要查询的编号:\n");    
        scanf("%s",&si);
        if(!p){
        printf("该编号不存在!\n");
        }else{
           while(p&&p->sid!=si){
             p=p->next;
           }
           if(!p){
            printf("该编号不存在!\n");
           }else{
             Output1(p);
           }
        }
        break;
        
        case 2:
        printf("请输入你要查询的姓名:\n");    
        scanf("%s",&na);
        if(!p){
        printf("该姓名不存在!\n");
        }else{
           while(p&&p->name!=na){
             p=p->next;
           }
           if(!p){
            printf("该姓名不存在!\n");
           }else{
             Output1(p);
           }
        }
        
        break;
        
        case 3:
        printf("请输入你要查询的出生年月:\n");    
        scanf("%s",&bi);
        if(!p){
        printf("该日期不存在!\n");
        }else{
           while(p&&p->birth!=bi){
             p=p->next;
           }
           if(!p){
            printf("该日期不存在!\n");
           }else{
             Output1(p);
           }
        }
        
        break;
        
        case 4:
        printf("请输入你要查询的学历:\n");    
        scanf("%s",&ed);
        if(!p){
        printf("该学历不存在!\n");
        }else{
           while(p&&p->edu!=ed){
             p=p->next;
           }
           if(!p){
            printf("该学历不存在!\n");
           }else{
             Output1(p);
           }
        }
        
        break;
        
        case 5:
        printf("请输入你要查询的职务:\n");    
        scanf("%s",&du);
        if(!p){
        printf("该职务不存在!\n");
        }else{
           while(p&&p->duty!=du){
             p=p->next;
           }
           if(!p){
            printf("该职务不存在!\n");
           }else{
             Output1(p);
           }
        }
        
        break; 
        
        case 6:
        printf("请输入你要查询的电话:\n");    
        scanf("%s",&nu);
        if(!p){
        printf("该电话不存在!\n");
        }else{
           while(p&&p->number!=nu){
             p=p->next;
           }
           if(!p){
            printf("该电话不存在!\n");
           }else{
             Output1(p);
           }
        }
        
        break; 
        
        case 7:
        printf("请输入你要查询的住址:\n");    
        scanf("%s",&ad);
        if(!p){
        printf("该住址不存在!\n");
        }else{
           while(p&&p->add!=ad){
             p=p->next;
           }
           if(!p){
            printf("该电话不存在!\n");
           }else{
             Output1(p);
           }
        }
        
        break; 
        
        default:
            printf("你输入的数字有误!\n");
        break;
    }
}


 
void Output1(LinkList S){
    LinkList p;
    p=S->next;
    printf("编号          姓名           出生年月           学历           职务           电话             住址\n");
    printf("%-14s%-16s%-18s%-15s%-15s%-16s%-18s\n",p->sid,p->name,p->birth,p->edu,p->duty,p->number,p->add);
}


void Output2(LinkList S){
    LinkList p;
    p=S->next;
    printf("编号          姓名           出生年月           学历           职务           电话             住址\n");
    while(p){
    printf("%-14s%-16s%-18s%-15s%-15s%-16s%-18s\n",p->sid,p->name,p->birth,p->edu,p->duty,p->number,p->add);
    p=p->next;
    }
}

/*
LinkList InitList(LinkList S)
{
 
    int n;
    S = (LinkList)malloc(sizeof(Node));
    S->next = NULL;
    int i;
    printf("请输入人数;") ;
    scanf("%d",n);
    for(i=0;i<n;i++)
    {
        LinkList p;//申请节点p
        p=(Node*)malloc(sizeof(Node));;
        printf("请输入插入的人员姓名:\n");
        scanf("%s",p->name) ;
        printf("请输入此人编号:\n"); 
        scanf("%s",p->sid);
        printf("请输入此人性别:\n");
        scanf("%s",p->gender);
          printf("请输入此人出生年月:\n"); 
          scanf("%s",p->birth);
        printf("请输入此人学历:\n");
        scanf("%s",p->edu);
        printf("请输入此人职务:\n");     
        scanf("%s",p->duty);
        printf("请输入此人电话:\n");     
        scanf("%s",p->number);
        printf("请输入此人住址:\n"); 
        scanf("%s",p->add);
        p->next = NULL;
        S->next = p;
        S = p;
    }
    
        return S;
} */
LinkList CreateLinkList(int n)
{
    LinkList LNode;
    LinkList H;
    H = (Node*)malloc(sizeof(LNode));  
    H->next = NULL; //(*H).next = NULL;
    int i;
    for(i=0;i<n;i++)
    {
        LinkList p;//申请节点p
        p=(Node*)malloc(sizeof(LNode));;
        printf("请输入插入的人员姓名:\n");
        scanf("%s",p->name) ;
        printf("请输入此人编号:\n"); 
        scanf("%s",p->sid);
        printf("请输入此人性别:\n");
        scanf("%s",p->gender);
          printf("请输入此人出生年月:\n"); 
          scanf("%s",p->birth);
        printf("请输入此人学历:\n");
        scanf("%s",p->edu);
        printf("请输入此人职务:\n");     
        scanf("%s",p->duty);
        printf("请输入此人电话:\n");     
        scanf("%s",p->number);
        printf("请输入此人住址:\n"); 
        scanf("%s",p->add);
        p->next = NULL;
        
        //把p点接入T后面
        H->next = p;
        H = p;
    } 
    return H;
}



int InsList(LinkList S, int i)  //插入信息 
{
    Node *pre,*s;
    int k;
    if(i <= 0)
    return  0;
    else
    {
        pre = S;
        k = 0;
        while(pre != NULL&&k < i-1)
        {
            pre = pre -> next;
            k = k++;
        }
        if(pre == NULL)
        {
         printf("插入位置不合理!\n");
        return 0; 
        }
        
        s = (Node*)malloc(sizeof(Node));

        printf("请输入插入的人员姓名:\n");
        scanf("%s",s->name) ;
        printf("请输入此人编号:\n"); 
        scanf("%s",s->sid);
        printf("请输入此人性别:\n");
        scanf("%s",s->gender);
          printf("请输入此人出生年月:\n"); 
          scanf("%s",s->birth);
        printf("请输入此人学历:\n");
        scanf("%s",s->edu);
        printf("请输入此人职务:\n");     
        scanf("%s",s->duty);
        printf("请输入此人电话:\n");     
        scanf("%s",s->number);
        printf("请输入此人住址:\n"); 
        scanf("%s",s->add);
        s ->next =pre ->next;
        pre->next = s;
        return 1;
    
    }
}
int DelList(LinkList S,int i)
{
    Node *pre=S,*r;
    int k;
    pre = 0;k = 0;
    while(pre->next != NULL&&k < i-1 )
    {
        pre = pre->next;
        k = k++;
    }
    if(k != i-1)
    {
    printf("删除结点位置不合理!");
    return 0;
    }
    r = pre->next;
    pre->next = pre->next->next;
    free(r);
    return 1;
}
  • 写回答

2条回答 默认 最新

  • iujbnuj 2023-06-15 20:07
    关注

    好的,让我来帮你看看代码问题。

    首先,在你的主函数中,你创建链表时使用了malloc申请内存,但是创建链表的函数中也有malloc申请内存,这样会造成内存泄漏。建议在创建链表函数中使用malloc,而在主函数中直接传入链表头指针。

    其次,在初始化函数InitList中,你没有将链表头节点赋值为NULL。建议在函数中添加以下语句:

    S->next = NULL;
    

    接下来,在查询函数search中,你进行字符串比较时使用了“!=”运算符,但是应该使用strcmp函数进行字符串比较。例如,在查询编号时,你应该修改为:

    while(p&&strcmp(p->sid, si) != 0){
        p=p->next;
    }
    

    在插入函数InsList中,你的k=k++应该修改为k++,否则k的值始终为0,导致插入位置计算错误。

    最后,在输出函数Output1中,你的员工信息输出格式可能存在一定问题,你可以根据需要调整一下输出格式。

    除此之外,还有一些小问题需要优化,例如输入时可以增加一些判断防止输入非法值等。希望以上内容对你有所帮助,祝你顺利完成任务!

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 6月24日
  • 已采纳回答 6月16日
  • 创建了问题 6月15日

悬赏问题

  • ¥50 求一位精通京东相关开发的专家
  • ¥100 求懂行的大ge给小di解答下!
  • ¥15 pcl运行在qt msvc2019环境运行效率低于visual studio 2019
  • ¥15 MAUI,Zxing扫码,华为手机没反应。可提高悬赏
  • ¥15 python运行报错 ModuleNotFoundError: No module named 'torch'
  • ¥100 华为手机私有App后台保活
  • ¥15 sqlserver中加密的密码字段查询问题
  • ¥20 有谁能看看我coe文件到底哪儿有问题吗?
  • ¥20 我的这个coe文件到底哪儿出问题了
  • ¥15 matlab使用自定义函数时一直报错输入参数过多