void addRecord(Node* head) { Node* p = head; while (p->next != NULL) { p = p->next; } Node* newNode = (Node*)malloc(sizeof(Node)); printf("请输入商品名称:"); scanf("%s", newNode->data.name); printf("请输入商品编号:"); scanf("%d", &newNode->data.id); printf("请输入商品类别:"); scanf("%s", newNode->data.category); printf("请输入商品生产厂家:"); scanf("%s", newNode->data.manufacturer); printf("请输入商品型号:"); scanf("%s", newNode->data.model); printf("请输入库存数量:"); scanf("%d", &newNode->data.quantity); printf("请输入当日销售数量:"); scanf("%d", &newNode->data.salesQuantity); printf("请输入零售价格:"); scanf("%f", &newNode->data.retailPrice); printf("请输入进货价格:"); scanf("%f", &newNode->data.purchasePrice); newNode->next = NULL; p->next = newNode; } 解释以上代码
时间: 2024-04-15 20:24:45 浏览: 11
以上代码是一个函数,名为addRecord。它的作用是向链表中添加新的记录。
首先,声明了一个指针p,将其指向链表的头节点head。
然后,使用while循环找到链表的最后一个节点,即p->next为NULL时停止循环,此时p指向最后一个节点。
接下来,使用malloc函数动态分配了一个新节点newNode,节点的大小为Node结构体的大小。
接着,通过printf和scanf函数依次输入商品的各个属性值。例如,输入商品名称、编号、类别、生产厂家、型号、库存数量、当日销售数量、零售价格和进货价格。
然后,将新节点的next指针设置为NULL,表示它是最后一个节点。
最后,将p的next指针指向新节点newNode,完成添加操作。
这样,新的记录就被添加到了链表中。
相关问题
利用C语言写出具有下列功能的程序使用链表 设计简单的菜单,能够进行系统功能选择 2.实现信息的录入功能。 3.在已有信息的基础上添加新的记录。 4.删除指定商品编号的记录。 5.修改指定商品编号的记录6按设备编号查询功能 7.能够计算出当日销售额 带注释 1.
下面是一个使用链表实现菜单功能的C语言程序:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义商品结构体
typedef struct {
int id;
char name[20];
float price;
int quantity;
} Product;
// 定义链表节点结构体
typedef struct Node {
Product data;
struct Node* next;
} Node;
// 初始化链表
Node* initList() {
Node* head = (Node*)malloc(sizeof(Node));
head->next = NULL;
return head;
}
// 添加商品记录
void addRecord(Node* head) {
Node* p = head;
while (p->next != NULL) {
p = p->next;
}
Node* newNode = (Node*)malloc(sizeof(Node));
printf("请输入商品编号:");
scanf("%d", &newNode->data.id);
printf("请输入商品名称:");
scanf("%s", newNode->data.name);
printf("请输入商品价格:");
scanf("%f", &newNode->data.price);
printf("请输入商品数量:");
scanf("%d", &newNode->data.quantity);
newNode->next = NULL;
p->next = newNode;
}
// 删除指定商品编号的记录
void deleteRecord(Node* head, int id) {
Node* p = head->next;
Node* prev = head;
while (p != NULL) {
if (p->data.id == id) {
prev->next = p->next;
free(p);
printf("删除成功!\n");
return;
}
prev = p;
p = p->next;
}
printf("未找到指定商品编号的记录!\n");
}
// 修改指定商品编号的记录
void modifyRecord(Node* head, int id) {
Node* p = head->next;
while (p != NULL) {
if (p->data.id == id) {
printf("请输入新的商品名称:");
scanf("%s", p->data.name);
printf("请输入新的商品价格:");
scanf("%f", &p->data.price);
printf("请输入新的商品数量:");
scanf("%d", &p->data.quantity);
printf("修改成功!\n");
return;
}
p = p->next;
}
printf("未找到指定商品编号的记录!\n");
}
// 按设备编号查询功能
void searchRecord(Node* head, int id) {
Node* p = head->next;
while (p != NULL) {
if (p->data.id == id) {
printf("商品编号:%d\n", p->data.id);
printf("商品名称:%s\n", p->data.name);
printf("商品价格:%.2f\n", p->data.price);
printf("商品数量:%d\n", p->data.quantity);
return;
}
p = p->next;
}
printf("未找到指定商品编号的记录!\n");
}
// 计算当日销售额
float calculateSales(Node* head) {
Node* p = head->next;
float totalSales = 0;
while (p != NULL) {
totalSales += p->data.price * p->data.quantity;
p = p->next;
}
return totalSales;
}
int main() {
Node* head = initList();
int choice;
int id;
while (1) {
printf("\n1.退出\n");
printf("2.信息录入\n");
printf("3.添加新记录\n");
printf("4.删除指定商品编号的记录\n");
printf("5.修改指定商品编号的记录\n");
printf("6.按设备编号查询\n");
printf("7.计算当日销售额\n");
printf("请选择功能:");
scanf("%d", &choice);
switch (choice) {
case 1:
return 0;
case 2:
addRecord(head);
break;
case 3:
addRecord(head);
break;
case 4:
printf("请输入要删除的商品编号:");
scanf("%d", &id);
deleteRecord(head, id);
break;
case 5:
printf("请输入要修改的商品编号:");
scanf("%d", &id);
modifyRecord(head, id);
break;
case 6:
printf("请输入要查询的商品编号:");
scanf("%d", &id);
searchRecord(head, id);
break;
case 7:
printf("当日销售额为:%.2f\n", calculateSales(head));
break;
default:
printf("无效的选择!\n");
}
}
return 0;
}
```
这个程序使用链表来存储商品信息,通过菜单选择不同的功能实现信息录入、添加记录、删除记录、修改记录、查询记录和计算当日销售额等功能。每个功能都有相应的函数实现,并且带有注释说明。你可以根据自己的需求进行修改和扩展。
帮我写一个双链表结构的记账函数
好的,以下是一个简单的双向链表结构的记账函数示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct _Record {
char name[20]; // 名字
double amount; // 金额
struct _Record *prev; // 前一个记录
struct _Record *next; // 后一个记录
} Record;
Record *head = NULL; // 链表头指针
// 添加一条记录
void addRecord(char *name, double amount) {
// 创建一个新节点
Record *newRecord = (Record*)malloc(sizeof(Record));
strcpy(newRecord->name, name);
newRecord->amount = amount;
newRecord->prev = NULL;
newRecord->next = NULL;
if (head == NULL) {
// 如果链表为空,将新节点作为链表头
head = newRecord;
} else {
// 否则将新节点插入到链表头之后
newRecord->next = head->next;
if (head->next != NULL) {
head->next->prev = newRecord;
}
head->next = newRecord;
newRecord->prev = head;
}
}
// 显示所有记录
void showRecords() {
Record *current = head;
while (current != NULL) {
printf("%s: %.2f\n", current->name, current->amount);
current = current->next;
}
}
// 删除所有记录
void clearRecords() {
Record *current = head;
while (current != NULL) {
Record *next = current->next;
free(current);
current = next;
}
head = NULL;
}
int main() {
addRecord("John", 10.0);
addRecord("Mike", 20.0);
addRecord("Lucy", 15.0);
showRecords();
clearRecords();
return 0;
}
```
以上代码实现了一个简单的双向链表结构,每个节点表示一条记录,包括名字和金额,可以添加、显示和清除所有记录。你可以根据自己的需求修改代码来实现更复杂的记账功能。