weixin_45802952
newgooooal
2020-11-30 12:21
采纳率: 71.4%
浏览 50

C语言基础的动态链表的创建,插入,删除,更新,查询

#include<stdio.h>
#include<stdlib.h>
#define COUNT 2 
typedef struct Data
{
char num[20];
char name[20];
char sex[10];
char nation[10];
char time[20];
char job[15];
};

typedef struct Node
{
struct Data data;//结构体类型//结构体嵌套
struct Node* next;//结构体指针型
}node,*Pnode;

Pnode phead=NULL;
Pnode ptail=NULL;

//创建结点
Pnode creat_node()
{
int i=0;
Pnode pnew=NULL;
for(i=0;i<COUNT;i++)  //COUNT为节点数
{
pnew=(Pnode)malloc(sizeof(node));//创建一个新节点
printf("请输入第%d个人员的信息:\n",(i+1));
printf("工号:\n");
scanf("%s",pnew->data.num);
printf("姓名:\n");
scanf("%s",pnew->data.name);
printf("性别:\n");
scanf("\n%s",&pnew->data.sex);
printf("族别:\n");
scanf("%s",&pnew->data.nation);
printf("入职时间:\n");
scanf("%s",&pnew->data.time);
printf("职务:\n");
scanf("%s",&pnew->data.job);
if(ptail)
{
    ptail->next=pnew;//第一个以后的结点
    ptail=pnew;
}
else
{
   phead=ptail=pnew;//第一个节点
}
  pnew->next=NULL;
}
return phead;
}

int main(){
  struct Node * pt;
  pt=creat_node();
  printf("\n num:%s,name:%s,sex:%s,nation:%s,date:%s,job:%s\n",pt->data.num,pt->data.name,pt->data.sex,pt->data.nation,pt->data.time,pt->data.job);
  return 0;
}

如代码所示已经实现了creat创建动态链表保存信息,

求问:

编写函数:insert向链表插入节点,编写函数del删除链表指定节点,编写函数update更改指定节点数据,编写函数search搜索指定姓名职工,编写函数travel遍历所有职工信息。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

11条回答 默认 最新

  • peng450
    peng450 2020-12-01 20:16
    已采纳
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define COUNT 2 
    struct Data
    {
        char num[20];
        char name[20];
        char sex[10];
        char nation[10];
        char time[20];
        char job[15];
    };
    
    typedef struct Node
    {
        struct Data data;//结构体类型//结构体嵌套
        struct Node* next;//结构体指针型
    }node,*Pnode;
    
    Pnode phead=NULL;
    Pnode ptail=NULL;
    
    //创建结点
    Pnode creat_node()
    {
        int i=0;
        Pnode pnew=NULL;
        for(i=0;i<COUNT;i++)  //COUNT为节点数
        {
            pnew=(Pnode)malloc(sizeof(node));//创建一个新节点
            printf("请输入第%d个人员的信息:\n",(i+1));
            printf("工号:\n");
            scanf("%s",pnew->data.num);
            printf("姓名:\n");
            scanf("%s",pnew->data.name);
            printf("性别:\n");
            scanf("\n%s",&pnew->data.sex);
            printf("族别:\n");
            scanf("%s",&pnew->data.nation);
            printf("入职时间:\n");
            scanf("%s",&pnew->data.time);
            printf("职务:\n");
            scanf("%s",&pnew->data.job);
            if(ptail)
            {
                ptail->next=pnew;//第一个以后的结点
                ptail=pnew;
            }
            else
            {
                phead=ptail=pnew;//第一个节点
            }
            pnew->next=NULL;
        }
        return phead;
    }
    
    
    int del(char *num)
    {
        Pnode p_dst = phead;
        Pnode p_tmp = NULL;
        if(!num)
            return -1;
        
        while(p_dst)
        {
            if(strcmp(p_dst->data.num, num) == 0)
                break;
            p_tmp = p_dst;
            p_dst = p_dst->next;
        }
    
        if(p_dst)
        {
            if(p_dst == phead)
            {
                phead = phead->next;
                if(p_dst == ptail)
                    ptail = NULL;
            }
            else
            {
                p_tmp->next = p_dst->next;
                if(p_dst == ptail)
                    ptail = p_tmp;
            }
            
            free(p_dst);
            return 0;
        }
        return -1;
    }
    
    Pnode search(char *num)
    {
        Pnode p_dst = phead;
        if(!num)
            return NULL;
        
        while(p_dst)
        {
            if(strcmp(p_dst->data.num, num) == 0)
                return p_dst;
            p_dst = p_dst->next;
        }
        return NULL;
    }
    
    int update(char *num)
    {
        Pnode p_dst;
        char str[32];
    
        if(p_dst = search(num))
        {
            printf("新工号: ");
            scanf("%s",p_dst->data.num);
            printf("姓名(%s): ", p_dst->data.name);
            scanf("%s",p_dst->data.name);
            printf("性别(%s): ", p_dst->data.sex);
            scanf("%s",p_dst->data.sex);
            printf("族别(%s): ", p_dst->data.nation);
            scanf("%s",p_dst->data.nation);
            printf("入职时间(%s): ", p_dst->data.time);
            scanf("%s",p_dst->data.time);
            printf("职务(%s): ", p_dst->data.job);
            scanf("%s",p_dst->data.job);
            return 0;
        }
        return -1;
    }
    
    void travel(FILE *fp)
    {
        Pnode p_dst = phead;
        
        while(p_dst)
        {
            fprintf(fp,"num:%s,name:%s,sex:%s,nation:%s,date:%s,job:%s\n",
                p_dst->data.num,p_dst->data.name,p_dst->data.sex,p_dst->data.nation,p_dst->data.time,p_dst->data.job);
            p_dst = p_dst->next;
        }
    }
    
    int insert()
    {
        int i, where;
        Pnode pnew=NULL, p_dst = phead, p_tmp;
    
        pnew=(Pnode)malloc(sizeof(node));//创建一个新节点
        printf("请输入要插入的人员信息:\n");
        printf("位置: ");
        scanf("%d", &where);
        printf("工号: ");
        scanf("%s",pnew->data.num);
        if(search(pnew->data.num))
        {
            printf("ERROR: 工号已存在!\n");
            return -1;
        }
    
        printf("姓名: ");
        scanf("%s",pnew->data.name);
        printf("性别: ");
        scanf("\n%s",&pnew->data.sex);
        printf("族别: ");
        scanf("%s",&pnew->data.nation);
        printf("入职时间: ");
        scanf("%s",&pnew->data.time);
        printf("职务: ");
        scanf("%s",&pnew->data.job);
        while(p_dst && --where > 0)
        {
            p_tmp = p_dst;
            p_dst = p_dst->next;
        }
    
        if(phead == NULL)
        {
            phead=ptail=pnew;
        }
        else if(phead == p_dst)
        {
            pnew->next = phead;
            phead = pnew;
        }
        else if(NULL == p_dst)
        {
            ptail->next=pnew;
            ptail=pnew;
        }
        else
        {
            pnew->next = p_tmp->next;
            p_tmp->next = pnew;
        }
        
        return 0;
    }
    
    int put_file()
    {
        FILE * fp;
        char filename[128];
        printf("请输入文件名:");
        scanf("%s",filename);
        fp = fopen(filename, "w");
        if(fp)
        {
            travel(fp);
            fclose(fp);
        }
        return 0;
    }
    
    int main(){
        struct Node * pt;
        char str[32];
        pt=creat_node();
        //printf("\n num:%s,name:%s,sex:%s,nation:%s,date:%s,job:%s\n",pt->data.num,pt->data.name,pt->data.sex,pt->data.nation,pt->data.time,pt->data.job);
        travel(stdout);
        insert();
        travel(stdout);
        printf("请输入要搜索的人员工号:");
        scanf("%s",str);
        if(pt = search(str))
        {
           printf("num:%s,name:%s,sex:%s,nation:%s,date:%s,job:%s\n",pt->data.num,pt->data.name,pt->data.sex,pt->data.nation,pt->data.time,pt->data.job);
        }
        else
        {
            printf("No data!\n");
        }
        
        printf("请输入要修改的人员工号:");
        scanf("%s",str);
        if(update(str) != 0)
        {
            printf("failed to update %s\n", str);
        }
        travel(stdout);
        printf("请输入要删除的人员工号:");
        scanf("%s",str);
        if(del(str) != 0)
        {
            printf("failed to delete %s\n", str);
        }
        travel(stdout);
        put_file();
    
        return 0;
    }
    
    点赞 评论
  • peng450
    peng450 2020-11-30 12:48

    编写函数del删除链表指定节点,编写函数update更改指定节点数据

    这个应该按照名字删除或更改还是直接传节点地址删除或更改?

    点赞 评论
  • weixin_45802952
    newgooooal 2020-11-30 12:58

    按照num吧,查询也根据num,我这里num定义的是工号

    点赞 评论
  • peng450
    peng450 2020-11-30 14:07
    #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    #define COUNT 2 
    struct Data
    {
        char num[20];
        char name[20];
        char sex[10];
        char nation[10];
        char time[20];
        char job[15];
    };
    
    typedef struct Node
    {
        struct Data data;//结构体类型//结构体嵌套
        struct Node* next;//结构体指针型
    }node,*Pnode;
    
    Pnode phead=NULL;
    Pnode ptail=NULL;
    
    //创建结点
    Pnode creat_node()
    {
        int i=0;
        Pnode pnew=NULL;
        for(i=0;i<COUNT;i++)  //COUNT为节点数
        {
            pnew=(Pnode)malloc(sizeof(node));//创建一个新节点
            printf("请输入第%d个人员的信息:\n",(i+1));
            printf("工号:\n");
            scanf("%s",pnew->data.num);
            printf("姓名:\n");
            scanf("%s",pnew->data.name);
            printf("性别:\n");
            scanf("\n%s",&pnew->data.sex);
            printf("族别:\n");
            scanf("%s",&pnew->data.nation);
            printf("入职时间:\n");
            scanf("%s",&pnew->data.time);
            printf("职务:\n");
            scanf("%s",&pnew->data.job);
            if(ptail)
            {
                ptail->next=pnew;//第一个以后的结点
                ptail=pnew;
            }
            else
            {
                phead=ptail=pnew;//第一个节点
            }
            pnew->next=NULL;
        }
        return phead;
    }
    
    
    int del(char *num)
    {
        Pnode p_dst = phead;
        Pnode p_tmp = NULL;
        if(!num)
            return -1;
        
        while(p_dst)
        {
            if(strcmp(p_dst->data.num, num) == 0)
                break;
            p_tmp = p_dst;
            p_dst = p_dst->next;
        }
    
        if(p_dst)
        {
            if(p_dst == phead)
            {
                phead = phead->next;
                if(p_dst == ptail)
                    ptail = NULL;
            }
            else
            {
                p_tmp->next = p_dst->next;
                if(p_dst == ptail)
                    ptail = p_tmp;
            }
            
            free(p_dst);
            return 0;
        }
        return -1;
    }
    
    Pnode search(char *num)
    {
        Pnode p_dst = phead;
        if(!num)
            return NULL;
        
        while(p_dst)
        {
            if(strcmp(p_dst->data.num, num) == 0)
                return p_dst;
            p_dst = p_dst->next;
        }
        return NULL;
    }
    
    int update(char *num)
    {
        Pnode p_dst;
        char str[32];
    
        if(p_dst = search(num))
        {
            printf("姓名(%s): ", p_dst->data.name);
            scanf("%s",p_dst->data.name);
            printf("性别(%s): ", p_dst->data.sex);
            scanf("%s",p_dst->data.sex);
            printf("族别(%s): ", p_dst->data.nation);
            scanf("%s",p_dst->data.nation);
            printf("入职时间(%s): ", p_dst->data.time);
            scanf("%s",p_dst->data.time);
            printf("职务(%s): ", p_dst->data.job);
            scanf("%s",p_dst->data.job);
            return 0;
        }
        return -1;
    }
    
    void travel()
    {
        Pnode p_dst = phead;
        
        while(p_dst)
        {
            printf("num:%s,name:%s,sex:%s,nation:%s,date:%s,job:%s\n",
                p_dst->data.num,p_dst->data.name,p_dst->data.sex,p_dst->data.nation,p_dst->data.time,p_dst->data.job);
            p_dst = p_dst->next;
        }
    }
    
    int main(){
        struct Node * pt;
        char str[32];
        pt=creat_node();
        //printf("\n num:%s,name:%s,sex:%s,nation:%s,date:%s,job:%s\n",pt->data.num,pt->data.name,pt->data.sex,pt->data.nation,pt->data.time,pt->data.job);
        travel();
        printf("请输入要修改的人员工号:");
        scanf("%s",str);
        if(update(str) != 0)
        {
            printf("failed to update %s\n", str);
        }
        travel();
        printf("请输入要删除的人员工号:");
        scanf("%s",str);
        if(del(str) != 0)
        {
            printf("failed to delete %s\n", str);
        }
        travel();
    
        return 0;
    }
    点赞 评论
  • weixin_45802952
    newgooooal 2020-11-30 15:16

    插入(insert)函数没有写吗~
    查询(search)函数没有写完全吗,我调用查询结果显示不出来

    点赞 评论
  • peng450
    peng450 2020-11-30 16:13

    在main函数里面加入这一段

    
        printf("请输入要搜索的人员工号:");
        scanf("%s",str);
        if(pt = search(str))
        {
           printf("\n num:%s,name:%s,sex:%s,nation:%s,date:%s,job:%s\n",pt->data.num,pt->data.name,pt->data.sex,pt->data.nation,pt->data.time,pt->data.job);
        }
        else
        {
            printf("No data!\n");
        }

    那个creat_node()本身就是插入,你可以将那个COUNT改成你想要的添加多少个,可以传个参数入去,

    点赞 评论
  • weixin_45802952
    newgooooal 2020-11-30 17:06

    不行的,插入是,比如有6个数据,可以选择在第几个数据后面插入其他数据,不一定是在最后添加数据

    点赞 评论
  • weixin_45802952
    newgooooal 2020-11-30 17:08

    还有一个问题是:编写函数实现员工信息录入并保存在文件.txt中,在主函数调用。这个可以帮忙做一下嘛~

    点赞 评论
  • peng450
    peng450 2020-11-30 17:42

    你这是课程设计吧,这么多要求的。写了文件应该还要读出来吧,在第几个添加数据,再加上容错处理就很多了哦!

    点赞 评论
  • weixin_45802952
    newgooooal 2020-11-30 17:51

    酬金加了,写完立马采纳

     

    点赞 评论
  • weixin_45802952
    newgooooal 2020-11-30 23:54

    能把插入(insert)的代码写了吗~
    写了的话,我就采纳了~

    点赞 评论

相关推荐