newgooooal 2020-11-30 12:21 采纳率: 83.3%
浏览 168
已采纳

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 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;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(10条)

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)