C语言链表(增删改查)模板

list.h

#ifndef LIST_H
#define LIST_H

#include <stdio.h>
#include<stdlib.h>
#include<string.h>

//链表节点数据
typedef struct list_data
{
    char name[10];
    char drr[20];
    char phone[3][11];
}List_data;
//链表结构
typedef struct list
{
    List_data data;
    struct list* next;
}List;

List* list_create(void);
List* node_create(List_data data);
void list_add(List *head_node,List_data data);
void list_delete(List *head_node,List_data data);
void list_change(List *head_node,List_data change_data,List_data data);
void list_find(List *head_node,List_data data);
void list_print(List *head_node);
void outlink(List *head);
List* createlink(void);
#endif // LIST_H

list.c

#include"list.h"

List* list_create(void)
{
    List *head_node=(List*)malloc(sizeof (List));
    head_node->next=NULL;
    return head_node;
}

List* node_create(List_data data)
{
    List *new_node=(List*)malloc(sizeof (List));
    for (int i=0;i<10;i++) {
        new_node->data.name[i]=data.name[i];
    }
    for (int i=0;i<20;i++) {
        new_node->data.drr[i]=data.drr[i];
    }
    for (int i=0;i<3;i++) {
        for (int j=0;j<11;j++) {
            new_node->data.phone[i][j]=data.phone[i][j];
        }
    }
    new_node->next=NULL;
    return new_node;
}

void list_add(List *head_node,List_data data)
{
    List *new_node=node_create(data);
    List *tail_node=head_node;
    while(tail_node->next != NULL)
    {
        tail_node = tail_node->next;
    }
    tail_node->next = new_node;
}

void list_delete(List *head_node,List_data data)
{
    List *pos_node = head_node->next;
    List *pos_node_front = head_node;
    if (pos_node == NULL)
        printf("无法删除,链表为空!\n");
    else
    {
        while (strcmp(pos_node->data.name,data.name)!=0)
        {
            pos_node_front = pos_node;
            pos_node = pos_node->next;
            if (pos_node == NULL)
            {
                printf("没有找到相关信息,无法删除!\n");
                return;
            }

        }
        pos_node_front->next = pos_node->next;
        free(pos_node);
        pos_node = NULL;
    }
}

void list_change(List *head_node,List_data change_data,List_data data)
{
    List *pos_node = head_node->next;
    if (pos_node == NULL)
        printf("无法修改,链表为空!\n");
    else
    {
        while (strcmp(pos_node->data.name,data.name)!=0)
        {
            pos_node = pos_node->next;
            if (pos_node == NULL)
            {
                printf("没有找到相关信息,无法修改!\n");
                return;
            }

        }
        pos_node->data = change_data;
    }
}

void list_find(List *head_node,List_data data)
{
    List *pos_node = head_node->next;
    if (pos_node == NULL)
        printf("无法查找,链表为空!\n");
    else
    {
        while (strcmp(pos_node->data.name,data.name)!=0)
        {
            pos_node = pos_node->next;
            if (pos_node == NULL)
            {
                printf("没有找到相关信息!\n");
                return;
            }

        }
        printf("姓名:%s   电话:%s  地址:%s\n",pos_node->data.name,pos_node->data.phone[0],pos_node->data.drr);
    }
}

void list_print(List *head_node)
{
    List *pos_node = head_node->next;
    while (pos_node)
    {
        printf("姓名:%s   电话:%s  地址:%s\n",pos_node->data.name,pos_node->data.phone[0],pos_node->data.drr);
        pos_node = pos_node->next;
    }
}

List* createlink(void)
{
    List *head =(List*)malloc(sizeof(List));
    char t1[10];
    char t2[3][11];
    char t3[20];
    List *p;
    List *q;
    p=q=head;
    FILE * r= fopen("output.txt","r");
    if(r==NULL)
    {
        printf("打开文件失败!");
        return NULL;
    }

    while(fscanf(r,"姓名:%s   电话:%s  地址:%s\n",t1,t2[0],t3)!=EOF)
    {
       q= (List*)malloc(sizeof(List));
       strcpy(q->data.name,t1);
       strcpy(q->data.phone[0],t2[0]);
       strcpy(q->data.drr,t3);
       p->next=q;
       p=q;
    }
    p->next=NULL;
    return head;
}

void outlink(List *head)
{
   List *p=head->next;
   FILE *w =fopen("output.txt","w");
   if(w==NULL)
   {
       printf("打开文件失败!");
       return;
   }
   while(p)
   {
       //输出链表节点数据到屏幕
       //printf("%s ",p->data.name);
       //输出链表节点数据到文件output.txt
       fprintf(w,"姓名:%s   电话:%s  地址:%s\n",p->data.name,p->data.phone[0],p->data.drr);
       p=p->next;
   }
   printf("\n");
   fprintf(w,"\n");
   fclose(w);
   return;
}

main.c

#include<stdio.h>
#include<stdlib.h>
#include"list.h"

int main()
{
    //从文件加载通讯录
    List* list;
    list=createlink();
    list_print(list);
    printf("通讯录加载完毕!\n\n");

    //添加联系人信息
    List_data data;
    int people_number;
    printf("请输入要添加信息的人数:");
    scanf("%d",&people_number);
    for (int i=0;i<people_number;i++) {
        printf("请输入姓名:");
        scanf("%s",data.name);
        printf("请输入电话:");
        scanf("%s",data.phone[0]);
        printf("请输入地址:");
        scanf("%s",data.drr);
        list_add(list,data);
    }
    system("cls");
    list_print(list);

    //删除指定联系人
    printf("\n请输入要删除信息人的姓名:");
    scanf("%s",data.name);
    list_delete(list,data);
    system("cls");
    printf("该联系人信息已删除!\n\n");
    list_print(list);

    //查找指定联系人
    printf("\n请输入要查找的姓名:");
    scanf("%s",data.name);
    list_find(list,data);

    //修改指定联系人
    printf("\n请输入要修改的姓名:");
    scanf("%s",data.name);
    List_data change_data;
    printf("请输入修改后姓名:");
    scanf("%s",change_data.name);
    printf("请输入修改后电话:");
    scanf("%s",change_data.phone[0]);
    printf("请输入修改后地址:");
    scanf("%s",change_data.drr);
    list_change(list,change_data,data);
    printf("\n修改完成!\n");
    list_print(list);

    //保存文件
    outlink(list);
    printf("\n文件已保存到“output.txt”!\n");


    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值