创建具有多种元素类型的链表

时间:2018-12-08 23:50:01

标签: c data-structures linked-list

我的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上学习)

2 个答案:

答案 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
$ 

food.c

#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);
}