我的C课程上周最后一次上课,在学期末之前,我们还有价值1周的课程,我的教授决定取消其余课程。
我曾问过他为什么他不利用这段时间来教我们链表,他说:“决赛已经结束,所以我不需要教其他任何东西了。”
我仍然想学习链接列表,由于我的教授没有用,所以我想请您好心的人帮我解决我正在考虑的应用程序。
简单地说,我有一个文本文件,其内容如下:
Apple //name
12 //quantity
23.90 //price
Bananas //name
4 //quantity
12.90 //price
我了解如何将上述txt文件读入结构数组,但不了解如何对链表进行同样操作。
我的结构示例:
typedef struct
{
char food_name[BUF];
int food_quantity;
float food_cost;
}FOOD;
我想以剩下的代码为例,但是由于我还有2年的大学生涯,而且在接下来的3个学期中也有上面提到的同一位教授,所以我不想冒学术上的不诚实和潜在的明年学生接受我的作业答案(如果明年的班级中的任何人看到此内容,则可以在HW3上学习)
答案 0 :(得分:0)
结构的链接列表还具有指向下一个结构的附加指针,以将一个结构连接到下一个结构。一个简单的单个链接列表如下所示:
typedef struct food_s {
char food_name[BUF];
int food_quantity;
float food_cost;
struct food_s *next;
}food_t;
这仅仅是一个开始,但是有几本书描述了链表,双链表,二叉树等排序表,...
答案 1 :(得分:0)
这里有一些 rough 代码可以帮助您入门,我很懒惰,没有去释放分配的FOOD内存。
通过示例进行学习,我学得最好。我鼓励您密切注意指针显示的值(各种printfs中的%p )。例如, next = 0xa22070 哪里来自 name =“ Cherries” qty = 8 cost = 1.23 next = 0xa22070 ?
随着您获得用于各种数据结构(链接列表,树,队列)的更高级的代码,指针和内存管理将变得越来越重要。
祝你学习顺利:-)
$ gcc food.c
$ ./a.out
--- directly calling print_food() ---
FOOD addr=0xa22010 name="Apple" qty=12 cost=23.90 next=(nil)
FOOD addr=0xa22070 name="Bananas" qty=4 cost=12.90 next=0xa22010
FOOD addr=0xa220d0 name="Cherries" qty=8 cost=1.23 next=0xa22070
--- calling print_food_list() ---
food list #001: FOOD addr=0xa220d0 name="Cherries" qty=8 cost=1.23 next=0xa22070
food list #002: FOOD addr=0xa22070 name="Bananas" qty=4 cost=12.90 next=0xa22010
food list #003: FOOD addr=0xa22010 name="Apple" qty=12 cost=23.90 next=(nil)
Done, n=3
$
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define BUF 64
typedef struct food
{
char name[BUF];
int quantity;
float cost;
struct food *next; // ptr to next food, otherwise null.
} FOOD;
FOOD *make_food(char *name, int quantity, float cost, FOOD *next) {
FOOD *p = malloc(sizeof(FOOD));
strcpy( p->name, name);
p->quantity = quantity;
p->cost = cost;
p->next = next;
return p;
}
void print_food(FOOD *p) {
printf("FOOD addr=%p name=\"%s\" qty=%d cost=%.2f next=%p\n",
p, p->name, p->quantity, p->cost, p->next);
}
int print_food_list(FOOD *p) {
int length = 0;
while( p ) {
++length;
printf("food list #%03d: ", length); // note lack of \n
print_food(p);
p = p->next;
}
return length;
}
void main(int argc, char** argv) {
FOOD *a = make_food( "Apple", 12, 23.90, (FOOD *)NULL );
FOOD *b = make_food( "Bananas", 4, 12.90, a);
FOOD *c = make_food( "Cherries", 8, 1.23, b);
printf("--- directly calling print_food() ---\n");
print_food(a);
print_food(b);
print_food(c);
printf("--- calling print_food_list() ---\n");
int n = print_food_list(c);
// int n = print_food_list(a); // what would happen with a?
printf("Done, n=%d\n", n);
}