将双链接列表保存到C txt文件

将双链接列表保存到C txt文件,c,C,我有下面的c代码,它将一个新联系人保存在一个双链接列表中(到目前为止,这是可行的),但是,将新联系人保存在一个.txt文件中,并参考它列出、更改和删除该文件,然后再次参考 **有没有人知道我是如何进行同步的,这样我就能确定自己的方向** 它必须是代码,我甚至不能使用外部库 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> typedef st

我有下面的c代码,它将一个新联系人保存在一个双链接列表中(到目前为止,这是可行的),但是,将新联系人保存在一个.txt文件中,并参考它列出、更改和删除该文件,然后再次参考

**有没有人知道我是如何进行同步的,这样我就能确定自己的方向** 它必须是代码,我甚至不能使用外部库

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

typedef struct contato {
    char nome[50];
    char sexo;
    int idade;
    char fone[15];
    char email;
    struct contato *ant, *prox;
}Tcontato;

typedef struct indice {
    char letra;
    struct indice *ant, *prox;
    Tcontato *inicio;
}Tindice ;

////Funçoes de Busca////
Tindice * procurarLetra(Tindice * ind, char letra) {
    Tindice * aux = ind;
    while (aux->letra <= letra) {
        if (aux->letra == letra) {
            return aux;
        }
        else if (aux->prox == ind) {
            break;
        }
        else {
            aux = aux->prox;
        }
    }
    return NULL;
}
Tcontato * buscaContatoDoIndice(Tcontato *l, char nome[]) {
    Tcontato* aux = l;
    do {
        if (strcmp(nome, aux->nome) == 0) {
            return aux;
        }
        else {
            aux = aux->prox;
        }
    } while (aux != l);
    return NULL;
}
Tcontato * busca(Tindice  *l, char nome[]) {
    char letra = toupper(nome[0]);
    Tindice * noIndice;
    noIndice = procurarLetra(l, letra);
    if (noIndice == NULL) {//N achou o indice da letra
        return NULL;
    }
    else {
        return buscaContatoDoIndice(noIndice->inicio, nome);
    }
}

/////Funçoes para criar nós////
Tindice * criarLetra(char letra) {
    Tindice * novo;
    novo = (Tindice *)malloc(sizeof(Tindice));
    novo->letra = letra;
    novo->ant = NULL;
    novo->prox = NULL;
    novo->inicio = NULL;
    return novo;
}
Tcontato * criarNo(char nome[]) {
    Tcontato * novo;
    novo = (Tcontato *)malloc(sizeof(Tcontato));
    strcpy(novo->nome, nome);
    printf("Informe o telefone: ");
    gets(novo->fone);
    fflush(stdin);
    novo->ant = NULL;
    novo->prox = NULL;
    return novo;
}

/////Funçoes do programa principal////
void cadastrar(Tindice ** l, char nome[]) {
    Tindice * noIndice, *novoIndice;
    Tcontato *novoNo, * no;
    char letra = toupper(nome[0]);

    ////////agenda vazia/////////
    if (*l == NULL) {
        novoIndice = criarLetra(letra);//cria o indice
        (*l) = novoIndice;
        novoIndice->ant = novoIndice;
        novoIndice->prox = novoIndice;
        novoNo = criarNo(nome);//Criar o NÓ do contato
        (*l)->inicio = novoNo;
        novoNo->prox = novoNo;
        novoNo->ant = novoNo;
        printf("Novo contato inserido\n");
    }
    else {
        ////////agenda Tem pelo menos uma letra////////
        noIndice = procurarLetra(*l, letra);
        ///////////Indice não existe//////////
        if (noIndice == NULL) { //Indice n existe
            noIndice = *l;
            if (noIndice->letra > letra) {
                novoIndice = criarLetra(letra);//cria o indice no inicio
                novoIndice->ant = (*l)->ant;
                novoIndice->prox = *l;
                (*l)->ant->prox = novoIndice;
                (*l) = novoIndice;
                novoNo = criarNo(nome);//Criar o NÓ do contato no inicio
                novoIndice->inicio = novoNo;
                novoNo->prox = novoNo;
                novoNo->ant = novoNo;
                printf("Novo contato inserido\n");
            }
            else {
                do {
                    if (noIndice->prox->letra > letra) {
                        novoIndice = criarLetra(letra);//cria o indice no meio
                        novoIndice->prox = noIndice->prox;
                        novoIndice->ant = noIndice;
                        novoIndice->ant->prox = novoIndice;
                        novoIndice->prox->ant = novoIndice;
                        novoNo = criarNo(nome);//Criar o NÓ do contato no inicio
                        novoIndice->inicio = novoNo;
                        novoNo->prox = novoNo;
                        novoNo->ant = novoNo;
                        printf("Novo contato inserido\n");
                        return;
                    }
                    else {
                        noIndice = noIndice->prox;
                    }
                } while (noIndice != *l);//ACABA o noIndice APONTANDO PARA O PRIMEIRO
                novoIndice = criarLetra(letra);//cria o indice no final
                novoIndice->prox = noIndice;
                novoIndice->ant = noIndice->ant;
                noIndice->ant->prox = novoIndice;
                noIndice->ant = novoIndice;
                novoNo = criarNo(nome);//Criar o NÓ do contato no inicio
                novoIndice->inicio = novoNo;
                novoNo->prox = novoNo;
                novoNo->ant = novoNo;
                printf("Novo contato inserido\n");
            }
        }
        ///////////Indice ja existe//////////
        else {
            no = buscaContatoDoIndice(noIndice->inicio, nome);
            if (no != NULL) {
                printf("Esse contato já existe\n");
            }
            else {
                no = noIndice->inicio;
                if (strcmp(no, nome)>0) {//Inserssão no inicio
                    novoNo = criarNo(nome);//Criar o NÓ do contato no inicio
                    novoNo->prox = no;
                    novoNo->ant = no->ant;
                    no->ant->prox = novoNo;
                    no->ant = novoNo;
                    noIndice->inicio = novoNo;
                }
                else {
                    do {
                        if (strcmp(no->prox->nome, nome)>0) { //Inserssão no meio
                            novoNo = criarNo(nome);//Criar o NÓ do contato no meio
                            novoNo->prox = no->prox;
                            novoNo->ant = no;
                            novoNo->ant->prox = novoNo;
                            novoNo->prox->ant = novoNo;
                            printf("Novo contato inserido\n");;
                            return;
                        }
                        else {
                            no = no->prox;
                        }
                    } while (no != noIndice->inicio);//ACABA no APONTANDO PARA O PRIMEIRO
                    novoNo = criarNo(nome);//Criar o NÓ do contato no final
                    novoNo->prox = no;
                    novoNo->ant = no->ant;
                    no->ant->prox = novoNo;
                    no->ant = novoNo;
                    printf("Novo contato inserido\n");;
                }
            }
        }
    }
}
void remover(Tindice ** l, char nome[]) {
    Tcontato * del;
    Tindice * noIndice;
    char letra = toupper(nome[0]);
    if (*l == NULL) {
        printf("Agenda vazia\n");
    }
    else {
        del = busca(*l, nome);
        noIndice = procurarLetra(*l, letra);
        if (del == NULL) {
            printf("Contato não encontrado\n");
        }
        //Se tiver apenas um nó na determinda letra//
        else if (del->prox == del) {//Se tiver apenas um nó na determinda letra
            free(del);
            //Remover indice da agenda//
            if (noIndice->prox == noIndice) {//A agenda só tem uma letra
                free(noIndice);
                *l = NULL;
                printf("Contato Removido\n");
            }
            else if (noIndice == *l) {    //A letra esta no primeiro indice
                *l = noIndice->prox;
                (*l)->prox = *l;
                (*l)->ant = *l;
                free(noIndice);
                printf("Contato Removido\n");
            }
            else if (noIndice->prox == *l) {//a letra esta no ultimo indice
                (*l)->ant = noIndice->ant;
                noIndice->ant->prox = *l;
                free(noIndice);
                printf("Contato Removido\n");
            }
            else {                          //a letra esta no meio
                (*l)->prox = noIndice->prox;
                noIndice->prox->ant = noIndice->ant;
                free(noIndice);
                printf("Contato Removido\n");
            }
        }
        //Mais de um nó na determinda letra, n precia desalocar o indice//
        else if (noIndice->inicio == del) { //o contato esta no inicio
            noIndice->inicio = del->prox;
            noIndice->inicio->prox = noIndice->inicio;
            noIndice->inicio->ant = noIndice->inicio;
            free(del);
            printf("Contato Removido\n");
        }
        else if (del->prox == noIndice->inicio) {//o contato esta no final
            noIndice->inicio->ant = del->ant;
            del->ant->prox = noIndice->inicio;
            free(del);
            printf("Contato Removido\n");
        }
        else {                                  //O contato esta no meio
            noIndice->inicio->prox = del->prox;
            del->prox->ant = del->ant;
            free(del);
            printf("Contato Removido\n");
        }
    }
}
void exibirContato(Tindice  *l, char nome[]) {
    Tcontato * aux;
    if (l == NULL) {
        printf("Agenda Vazia\n");
    }
    else {
        aux = busca(l, nome);
        if (aux == NULL) {
            printf("Contato não encontrado\n");
        }
        else {
            printf("Nome: %s\n", aux->nome);
            printf("Telefone: %s\n\n", aux->fone);
        }
    }
}
void alterarDados(Tindice  *l, char nome[]) {
    Tcontato * aux;
    if (l == NULL) {
        printf("Agenda Vazia\n");
    }
    else {
        aux = busca(l, nome);
        if (aux == NULL) {
            printf("Contato não encontrado\n");
        }
        else {
            printf("Informe o novo telefone: ");
            gets(aux->fone);
            fflush(stdin);
            printf("Telefone alterado\n");
        }
    }
}
void exibirTudo(Tindice  *l) {
    Tindice * i;
    Tcontato * x;
    if (l == NULL) {
        printf("Agenda vazia\n");
    }
    else {
        i = l;
        do {//Caminha nos indices
            x = i->inicio;
            do//Caminha nos nós dos contatos
            {
                printf("Nome: %s\n", x->nome);
                printf("Telefone: %s\n\n", x->fone);
                x = x->prox;
            } while (x != i->inicio);
            i = i->prox;
        } while (i != l);
    }
}
void exibirLetra(Tindice *l, char letra) {
    Tindice * noIndice;
    Tcontato * aux;
    char let = toupper(letra);
    if (l == NULL) {
        printf("Agenda Vazia\n");
    }
    else {
        noIndice = procurarLetra(l, let);
        if (noIndice == NULL) {
            printf("Letra não encontrada\n");
        }
        else {
            aux = noIndice->inicio;
            do {
                printf("Nome: %s\n", aux->nome);
                printf("Telefone: %s\n\n", aux->fone);
                aux = aux->prox;
            } while (aux != noIndice->inicio);
        }
    }
}
void removerTudo(Tindice  ** l) {
    if (l == NULL) {
        printf("Agenda vazia\n");
    }
}

int main() {
    Tindice * agenda = NULL;
    char nome[100], op, fone[100], letra;
    do {
        printf("\t\tEscolha uma opção\n\n");
        printf("1 - Inserir novo contato\n");
        printf("2 - Remover contato\n");
        printf("3 - Exibir um contato\n");
        printf("4 - Alterar telefone\n");
        printf("5 - Exibir toda agenda\n");
        printf("6 - Exibir os contatos de uma letra \n");
        printf("7 - Sair do Programa\n");
        op = getche();
        printf("\n");
        fflush(stdin);
        printf("\n");
        switch (op) {
        case '1':printf("Informe o nome do novo contato:");
            gets(nome);
            fflush(stdin);
            cadastrar(&agenda, nome);
            break;
        case '2':printf("Informe o nome do contato que deseja remover:");
            gets(nome);
            fflush(stdin);
            remover(&agenda, nome);
            break;
        case '3':printf("Informe o nome do contato que deseja exibir:");
            gets(nome);
            fflush(stdin);
            exibirContato(agenda, nome);
            break;
        case '4':printf("Informe o nome do contato que deseja alterar:");
            gets(nome);
            fflush(stdin);
            alterarDados(agenda, nome);
            break;
        case '5':exibirTudo(agenda);
            break;
        case '6':printf("Informe a letra:");
            scanf("%c", &letra);
            fflush(stdin);
            exibirLetra(agenda, letra);
            break;
        case '7':removerTudo(agenda);
            break;
        default: printf("Opcao Invalida \n");
        }
    } while (op != '7');
    return 0;
}
#包括
#包括
#包括
#包括
类型定义结构contato{
charnome[50];
char sexo;
int idade;
char fone[15];
字符电子邮件;
结构contato*ant,*prox;
}康塔托;
类型定义结构标识{
查莱特拉;
结构标识*ant,*prox;
t康托*伊尼西奥;
}锡丁;
////布斯卡之旅////
Tindice*procurarLetra(Tindice*ind,char-letra){
Tindice*aux=ind;
而(aux->letra letra==letra){
返回aux;
}
否则如果(辅助->前置==ind){
打破
}
否则{
辅助=辅助->前置;
}
}
返回NULL;
}
Tcontato*buscacontatodoice(Tcontato*l,字符名[]){
t接触*aux=l;
做{
如果(strcmp(nome,aux->nome)=0){
返回aux;
}
否则{
辅助=辅助->前置;
}
}while(aux!=l);
返回NULL;
}
t容器*busca(Tindice*l,字符名称[]){
char-letra=toupper(nome[0]);
Tindice*Nondice;
noIndice=procurarLetra(l,letra);
如果(noIndice==NULL){//N则表示
返回NULL;
}
否则{
返回总线CONTATODOINDICE(noIndice->inicio,nome);
}
}
/////费索斯·帕拉克里亚尔·诺斯(Funçoes para criar nós)////
Tindice*Crialletra(char letra){
Tindice*novo;
novo=(Tindice*)malloc(sizeof(Tindice));
诺沃->莱特拉=莱特拉;
novo->ant=NULL;
novo->prox=NULL;
novo->inicio=NULL;
返回诺沃;
}
t康托*克里亚诺(字符名称[]){
康塔托*诺沃;
novo=(Tcontato*)malloc(sizeof(Tcontato));
strcpy(novo->nome,nome);
printf(“Informe o telefone:”);
获取(novo->fone);
fflush(stdin);
novo->ant=NULL;
novo->prox=NULL;
返回诺沃;
}
/////Funçoes做一名校长////
无效地籍(Tindice**l,字符名称[]){
Tindice*noIndice,*novoIndice;
t联系人*novoNo,*no;
char-letra=toupper(nome[0]);
////////瓦齐亚议程/////////
如果(*l==NULL){
新印度=印度
(*l)=新印度;
新印度->蚂蚁=新印度;
novoIndice->prox=novoIndice;
novoNo=criarNo(nome);//Criar o NÓdo contato
(*l)->inicio=novoNo;
novoNo->prox=novoNo;
novoNo->ant=novoNo;
printf(“Novo contato inserido”);
}
否则{
////////会议议程////////
noIndice=procurarLetra(*l,letra);
///////////存在的迹象//////////
如果(noIndice==NULL){//表示存在
noIndice=*l;
如果(noIndice->letra>letra){
新印度=印度(letra);//印度
新印度->蚂蚁=(*l)->蚂蚁;
新印度->prox=*l;
(*l)->ant->prox=novoIndice;
(*l)=新印度;
novoNo=criarNo(nome);//Criar o NÓdo contato no inicio
novoIndice->inicio=novoNo;
novoNo->prox=novoNo;
novoNo->ant=novoNo;
printf(“Novo contato inserido”);
}
否则{
做{
如果(noIndice->prox->letra>letra){
novoIndice=criaretra(letra);//cria o indice no meio
novoIndice->prox=noIndice->prox;
novoIndice->ant=noIndice;
novoIndice->ant->prox=novoIndice;
novoIndice->prox->ant=novoIndice;
novoNo=criarNo(nome);//Criar o NÓdo contato no inicio
novoIndice->inicio=novoNo;
novoNo->prox=novoNo;
novoNo->ant=novoNo;
printf(“Novo contato inserido”);
返回;
}
否则{
noIndice=noIndice->prox;
}
}while(noIndice!=*l);//ACABA o noIndice APONTANDO PARA o PRIMEIRO
Novoindicie=criarLetra(letra);//cria o Indicie无最终版本
novoIndice->prox=Nondice;
novoIndice->ant=noIndice->ant;
noIndice->ant->prox=新印度;
noIndice->ant=新印度;
novoNo=criarNo(nome);//Criar o NÓdo contato no inicio
novoIndice->inicio=novoNo;
novoNo->prox=novoNo;
novoNo->ant=novoNo;
printf(“Novo contato inserido”);
}
}
///////////存在的迹象//////////
否则{
否=总线连接状态(noIndice->inicio,nome);
如果(否!=NULL){
printf(“Esse contato jáexiste”);
}
否则{
否=无提示->无提示;
如果(strcmp(no,nome)>0){//Inserssão no inicio
novoNo=criarNo(nome);//Criar o NÓdo contato no inicio
novoNo->prox=no;
novoNo->ant=no->ant;
否->ant->prox=novoNo;
否->ant=novoNo;
noIndice->inicio=novoNo;
}
否则{
做{
如果(strcmp(no->prox->nome,nome)>0{//Inserssão no meio
novoNo=criarNo(nome);//Criar o NÓdo contato no meio
novoNo->prox=no->prox;
novoNo->ant=no;
novoNo->ant->prox=novo