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条)

报告相同问题?

悬赏问题

  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 C#调用python代码(python带有库)
  • ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
  • ¥15 活动选择题。最多可以参加几个项目?
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能
  • ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面