建立如下的链表,每一行可以理解为一条交易记录,后面的200,300,500可以理解为项记录。
1,200,300,500
2,600,700
3,900,100
程序中结构体是如下定义的:
struct TransNode
{
int id;
struct ItemNode *Inext;
struct TransNode *next;
};
struct ItemNode
{
char *item;
struct ItemNode *next;
};
用尾部追加结点建立交易链表,Inext指向加入项的链表。
T_p=new TransNode;
T_p->id=atoi(temp);
ListInsertItem_Tail(LItem,buffer1); /尾部追加结点创建项的链表/
T_p->Inext=LItem;
T_p->next=NULL;
T_r->next=T_p;
T_r=T_p;
但打印输出结果却是
1,900,100,500
2,900,100
3,900,100
看输出结果是最后的数据把前面的数据覆盖了,我一度怀疑是T_r=T_p这条语句的问题,也就是后面的Inext把前面的Inext给覆盖掉了。
改为头部加入结点法问题还是这样。
后来在网上看到一篇博客,作者的程序建立多个班多个学生的成绩链表,作者写道:在学生结构体里面有 char *name,用来增加学生的名字信息,可是遍历结构体的时候就出现段错误。感谢大佬指点了一下,加了名字的结构体代码如下:char name[10]。
受此启发,我想到程序输出错误是不是我定义的char *item的问题,改为char item[10]后程序输出正确。
1,200,300,500
2,600,700
3,900,100
结构体定义中的char item[10];改成string item;也可以,代码只要把ListInsertItem_Tail函数中的strcpy(s->item,temp);改为s->item=temp; 就可以了。
建立一个文本文件trans.txt
1,200,300,500
2,600,700
3,900,100
修改后的程序代码如下:
/*
*********************************************************************
*模块名称:
*描述: 双链表嵌套实现的几行数据的链表的建立并打印输出
*编写日期:
*编写人:
*错误报告:
*最后改动日期:
*********************************************************************
*/
#include <iostream>
#include <fstream>
#include <cstring>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
typedef struct ItemNode
{
char item[10];
//此处原为char *item,因打印输出的时候最后的数据覆盖前面的,
//看到网上得到启发,改为char item[10]
ItemNode *next;
}*LinkListItem;
typedef struct TransNode
{