簡體   English   中英

使用鏈表制作電話簿系統

[英]making a phonebook system using linked list

我正在使用單鏈表在 c 中創建一個電話簿系統,似乎一切正常,但刪除選項總是給我一個錯誤,我不知道如何修復它,所以我希望有人能告訴我有什么問題代碼並顯示一個可以修改此代碼中的名稱或數字的代碼

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

struct node
{
    char firstname[20];
    char lastname[20];
    long int number;
    struct node *next;
};

struct node *head=NULL;

struct node *getnode()
{
    return((struct node *)malloc(sizeof(struct node)));
}


void display(struct node *head)
{
    struct node *temp;
    temp=head;
    while(temp!=NULL)
    {
        printf("%s\n",temp->firstname);
        printf("%s\n",temp->lastname);
        printf("%d\n",temp->number);
        temp=temp->next;
    }
}

void insert()
{
    struct node *temp,*newnode;
    newnode=getnode();
    temp=head;
    while(temp->next!=NULL)
    {
        temp=temp->next;

    }
    printf("Enter First name:\n");
    scanf("%s",&newnode->firstname);
    printf("Enter Last name:\n");
    scanf("%s",&newnode->lastname);
    printf("Enter number:\n");
    scanf("%d",&newnode->number);
    temp->next=newnode;
    newnode->next=NULL;
    display(head);
}
struct node *create()
{
    struct node *temp,*newnode;
    if(head!=NULL)
        insert();
    else
    {
    newnode=getnode();
    head=newnode;
    temp=head;
    printf("Enter First name:\n");
    scanf("%s",&newnode->firstname);
    printf("Enter Last name:\n");
    scanf("%s",&newnode->lastname);
    printf("Enter number:\n");
    scanf("%d",&newnode->number);
    newnode->next=NULL;
    display(head);
    }
}
void search()
{
    struct node *temp;
    char *first,*last;
    temp=head;
    printf("Enter name to be searched:\n");
    scanf("%s",&first);
    scanf("%s",&last);
    while((temp->firstname==first)&&(temp->lastname==last))
    {
        temp=temp->next;
    }
    printf("%s\n",temp->firstname);
    printf("%s\n",temp->lastname);
    printf("%d\n",temp->number);
}

void del()
{
    struct node *pretemp,*temp;
    char *f,*l;
    temp=head;
    pretemp=head->next;
    printf("Enter name :");
    scanf("%s",&f);
    scanf("%s",&l);
        while(temp!=NULL){
        if((pretemp->firstname==f)&&(pretemp->lastname==l))
        {
            printf("%s ",temp->firstname);
            printf("%s ",temp->lastname);
            printf("%s ",temp->number);
            temp=pretemp->next;
            delete pretemp;
            break;
        }
         else
        {
            temp=temp->next;
            pretemp=pretemp->next;
        }

}       
int main()
{
    int op,ch;
    do{
        printf("-------Welcome--------\n");
        printf("1.Create\n2.Display\n3.Delete\n4.Search\n");
        printf("Enter your choice:");
        scanf("%d",&ch);
        switch(ch)
        {
            case 1: create();
            break;
            case 2: display(head);
            break;
            case 3: del();
            break;
            case 4:search();
            break;

        }
        printf("Do you want to quit ? 1 for no / 0 for yes:");
        scanf("%d",&op);
    }while(op);
return 0;
}

這是錯誤

我對您的搜索和刪除功能進行了以下更改

  1. 搜索和刪除函數中的第一個和最后一個緩沖區在 scanf 中使用之前沒有分配內存。 這將導致運行時錯誤
  2. 您在 scanf 中捕獲用戶輸入的名字和姓氏的方式也不正確
  3. 在搜索和刪除功能中,我修改了字符串比較。 要與字符串進行比較,您需要使用strncmp函數。 使用==將檢查第一個字節的地址。
  4. 在搜索功能中,您沒有檢查列表末尾。
  5. 在 del 函數中,我已將printf("%s ", temp->number)更改為printf("%d ", temp->number)

void search()
{
    struct node *temp;
    char first[20], last[20];
    temp = head;
    printf("Enter name to be searched:\n");
    scanf("%s", first);
    scanf("%s", last);
    while (temp != NULL && ((strncmp(temp->firstname,  first, 20) != 0) && (strncmp(temp->lastname, last, 20) != 0)))
    {
        temp = temp->next;
    }
    if (temp != NULL) {
        printf("%s\n", temp->firstname);
        printf("%s\n", temp->lastname);
        printf("%d\n", temp->number);
    }
}

void del()
{
    struct node *pretemp, *temp;
    char first[20], last[20];
    temp = head;
    pretemp = head->next;
    printf("Enter name :");
    scanf("%s", first);
    printf("Enter Last name:");
    scanf("%s", last);
    while (temp != NULL) {
        if((strncmp(temp->firstname, first, 20) != 0) && (strncmp(temp->lastname, last, 20) != 0))
        {
            printf("%s ", temp->firstname);
            printf("%s ", temp->lastname);
            printf("%d ", temp->number);
            temp = pretemp->next;
            delete pretemp;
            break;
        }
        else
        {
            temp = temp->next;
            pretemp = pretemp->next;
        }

    }
}

我對您的代碼進行了一些更改,您可以在下面的代碼中找到注釋。 它是在 linux ubuntu 18.04 下編譯和比較的,現在可以使用了。 基本上,當您使用 scanf(" %s ", astr) 時,'astr' 應該有足夠的空間來接受輸入。

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

struct node
{
    char firstname[20];
    char lastname[20];
    long int number;
    struct node *next;
};

struct node *head=NULL;

struct node *getnode()
{
    return((struct node *)malloc(sizeof(struct node)));
}


void display(struct node *head)
{
    struct node *temp;
    temp=head;
    while(temp!=NULL)
    {
        printf("%s\n",temp->firstname);
        printf("%s\n",temp->lastname);
        printf("%ld\n",temp->number);  /* number is long int */
        temp=temp->next;
    }
}

void insert()
{
    struct node *temp,*newnode;
    newnode=getnode();
    temp=head;
    while(temp->next!=NULL)
    {
        temp=temp->next;

    }
    printf("Enter First name:\n");
    scanf("%s",newnode->firstname);
    printf("Enter Last name:\n");
    scanf("%s",newnode->lastname);
    printf("Enter number:\n");
    scanf("%ld",&newnode->number);
    temp->next=newnode;
    newnode->next=NULL;
    display(head);
}
struct node *create()
{
    struct node *temp,*newnode;
    if(head!=NULL)
        insert();
    else
    {
    newnode=getnode();
    head=newnode;
    temp=head;
    printf("Enter First name:\n");
    scanf("%s",newnode->firstname);
    printf("Enter Last name:\n");
    scanf("%s",newnode->lastname);
    printf("Enter number:\n");
    scanf("%ld",&newnode->number);
    newnode->next=NULL;
    display(head);
    }
}
void search()
{
    struct node *temp;
    char first[20], last[20]; /* space for input */
    temp=head;
    printf("Enter name to be searched:\n");
    scanf("%s",first);  /* you dont need '&' operator for string*/
    scanf("%s",last);
    while((temp->firstname==first)&&(temp->lastname==last))
    {
        temp=temp->next;
    }
    printf("%s\n",temp->firstname);
    printf("%s\n",temp->lastname);
    printf("%ld\n",temp->number); /* number is long int */
}

void del()
{
    struct node *pretemp,*temp;
    char f[20],l[20];   /* you need a space to store input */
    temp=head;
    pretemp=head->next;
    printf("Enter name :");
    scanf("%s",f);   /* you dont need '&' operator to access a string */
    scanf("%s",l);
    while(temp!=NULL){

        if((pretemp->firstname==f)&&(pretemp->lastname==l))
        {
            printf("%s ",temp->firstname);
            printf("%s ",temp->lastname);
            printf("%ld ",temp->number); /* 'number' is long int */
            temp=pretemp->next;
             free(pretemp);  /* 'delete' is c++ operator, not C */
            break;
        }
         else
        {
            temp=temp->next;
            pretemp=pretemp->next;
        }
    } /* missing curly bracket */
}
int main()
{
    int op,ch;
    do{
        printf("-------Welcome--------\n");
        printf("1.Create\n2.Display\n3.Delete\n4.Search\n");
        printf("Enter your choice:");
        scanf("%d",&ch);
        switch(ch)
        {
            case 1: create();
            break;
            case 2: display(head);
            break;
            case 3: del();
            break;
            case 4:search();
            break;

        }
        printf("Do you want to quit ? 1 for no / 0 for yes:");
        scanf("%d",&op);
    }while(op);
return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM