gpt4 book ai didi

C 结构体和链表之争

转载 作者:行者123 更新时间:2023-11-30 14:56:17 25 4
gpt4 key购买 nike

所以,我们刚刚开始在我的在线类(class)中学习链表和数据结构,但我一直在这个主题上苦苦挣扎。我对指针有一个大致的了解,但是当你将所有内容结合起来时,我完全迷失了。

因此,对于这个程序,我应该处理员工数据并通过使用结构和指针来访问它。但是,我认为我没有将正确的值传递到函数中,因为数据没有被保存并且我无法访问它。任何帮助将不胜感激。

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

struct address {
char street[49];
char city[29];
char state[2];
char zip[5];
};

struct data{
char name[39];
struct address addy;
float salary;
struct data *next;
} emp;

void LIST(struct data* head);
void INSERT(struct data* head, char* name, struct address addr, float salary);
void DELETE(char* name, struct data* head);
void EDIT(struct data* head, char* name, struct address addr, float salary);
void CALCPAYROLL(struct data* head);
void HELP();

int main()
{
char input[15];
int quitter = 1;
struct data *head = NULL;
head = malloc(sizeof(emp));
if (head == NULL){
return 1;
}

while(quitter == 1)
{
printf(" enter command: \n");
fgets(input,15, stdin);
input[strlen(input) -1] = '\0';
if((strcmp(input, "List") == 0) || (strcmp(input, "list") == 0))
{
LIST(head);
}
if((strcmp(input, "Insert") == 0) || (strcmp(input, "insert") == 0))
{
scanf("%s-%s-%s-%s-%s-%f", head->name, head->addy.street, head->addy.city, head->addy.state, head->addy.zip, &head->salary);
INSERT(head, head->name, head->addy, head->salary);
}
if ((strcmp(input, "Delete") == 0) || (strcmp(input, "delete") == 0))
{
DELETE(head->name, head);
}
if ((strcmp(input, "Edit") == 0) || (strcmp(input, "edit") == 0))
{
EDIT(head, head->name, head->addy, head->salary);
}
if ((strcmp(input, "Payroll") == 0) || (strcmp(input, "payroll") == 0))
{
CALCPAYROLL(head);
}
if ((strcmp(input, "Help") == 0) || (strcmp(input, "help") == 0))
{
HELP();
}
if ((strcmp(input, "Quit") == 0) || (strcmp(input, "quit") == 0))
{
printf("============\nGood bye!\n");
quitter = 0;
}
}
return 0;
}

void LIST(struct data* head)
{
struct data* temp = head;
while (temp) {
printf("%s\n%s\n%s, %2s %5s\n%9.2f\n-----\n", temp->name, temp->addy.street, temp->addy.city, temp->addy.state, temp->addy.zip, temp->salary);
temp = temp->next;
printf("%s\n%s\n%s, %2s %5s\n%9.2f\n-----\n", temp->name, temp->addy.street, temp->addy.city, temp->addy.state, temp->addy.zip, temp->salary);
temp = temp->next;
}
}

void INSERT(struct data* head, char* name, struct address addr, float salary)
{
struct data* newEmployee = NULL;
newEmployee = (struct data*)malloc(sizeof(emp));

strcpy(newEmployee->name, head->name);
newEmployee->salary = head->salary;

strcpy(newEmployee->addy.street, head->addy.street);

strcpy(newEmployee->addy.city, head->addy.city);

strcpy(newEmployee->addy.state, head->addy.state);

strcpy(newEmployee->addy.zip, head->addy.zip);
struct data* temp = head;
while(temp->next && temp->next->name > newEmployee->name)
{
temp = temp->next;
}
newEmployee->next = temp->next;
temp->next = newEmployee;

}

void DELETE(char* name, struct data* head)
{
char del[39];
scanf("%39s", del);
struct data * toBeDeleted = NULL;
struct data * temp = head;
while (strcmp(del, temp->name) == 0)
{
strcpy(temp->next->name, temp->name);

temp->addy = temp->next->addy;
temp->salary = temp->next->salary;
toBeDeleted = temp->next;
temp->next = temp->next->next;
free(toBeDeleted);
printf("RECORD DELETED\n");
}
temp = temp->next;
printf("RECORD NOT FOUND\n");
}

void EDIT(struct data* head, char* name, struct address addr, float salary)
{
char edit[39];
scanf("%39s", edit);
struct data* temp = head;
while (strcmp(edit, temp->name) == 0)
{
temp->addy = addr;
temp->salary = salary;

printf("RECORD EDITED\n");
return;
}
temp = temp->next;
printf("RECORD NOT FOUND\n");
}

void CALCPAYROLL(struct data* head)
{
struct data* temp = head;
float total;
while (temp)
{
total += temp->salary;
temp = temp->next;
}
printf("total payroll: %f", total);
}

void HELP()
{
printf("commands:\n");
printf("List - shows the list of employees\n");
printf("Insert - Creates a new employee record\n");
printf("Delete - Deletes an existing employee record\n");
printf("Edit - Modifies the contents of an employee record\n");
printf("Payroll - Calculates and displays the total payroll\n");
printf("Help - Displays the set of available commands\n");
printf("Quit - Prints the message ""good bye!"" and exits the program" );
}

最佳答案

首先,我必须赞扬您的精彩演讲。该代码可读且易于遵循。我发现它的唯一缺点是所有大写名称通常都保留给使用 #define 声明的宏和常量。

这里:

struct data{
char name[39];
struct address addy;
float salary;
struct data *next;
} emp; // declaring a variable at the same time as the structure? Not very nice.

我发现当您创建第一个列表项(即标题)时会出现问题。 Insert 必须有办法修改 head 参数。这需要额外的间接级别。 INSERT 还应该返回错误代码,以防 malloc 失败,常见的方法是在错误时返回负值 (-1)。

void INSERT(struct data* head, char* name, struct address addr, float salary)

// should be
int INSERT(struct data** head, char* name, struct address addr, float salary)

head 在条目上为 NULL 时,您必须稍微更改逻辑才能使用新分配的缓冲区设置 head。然后调用 INSERT 就变成了。

   if (INSERT(&head, name, &addr, salary) < 0)
{
// error !
}

我发现 INSERT 中的数据分配存在问题。

struct data* newEmployee = NULL;
//newEmployee = (struct data*)malloc(sizeof(emp)); // ?? you allocate a struct data, what's emp?
// should read
newEmployee = (struct data*)malloc(sizeof(struct data));

删除和编辑不起作用。他们找不到所写的员工。您应该考虑使用 find() 函数,如下所示:

data* FindEmployeeData(data* head, const char* name)
{
while (head)
{
if (strcmp(head->name, name) == 0)
break;
head = head->next;
}
return head;
}

在为员工编写新操作时,这可能会节省时间。

在插入中:

while(temp->next && temp->next->name > newEmployee->name) 

我认为字符串应该与 strcmp() 进行比较...

在 DELETE 中:与 INSERT 相同,该函数可以更改列表的头部

int DELETE(data** head, const char* name); // returns -1 on error.

这里:

scanf("%s-%s-%s-%s-%s-%f", head->name, head->addy.street, head->addy.city, head->addy.state, head->addy.zip, &head->salary);

当用户输入的名称、地址、州、街道、城市或邮政编码对于您分配的空间来说太长时,就会发生可怕的事情。

关于C 结构体和链表之争,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44813917/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com