70,020
社区成员




不知道哪里出问题了
#include <iostream>
#include <cstring>
using namespace std;
typedef int ElemType;
typedef struct LNode {
ElemType sn;
ElemType sc;
string name;
struct LNode *next;
} *LinkList, LNode;
void InitList(LinkList &L);
LinkList List_HeadInsert(LinkList &L);
void InsertLink(LinkList &L1, LinkList &L2);
void display(LinkList L);
int main() {
LinkList L1;
InitList(L1);
List_HeadInsert(L1);
display(L1);
}
void InitList(LinkList &L) {
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
}
LinkList List_HeadInsert(LinkList &L) {
ElemType tsn, tsc;
string tname;
L = (LinkList)malloc(sizeof(LNode));
LNode *s, *r = L;
cin >> tsn >> tname >> tsc;
while (true) {
s = (LinkList)malloc(sizeof(LNode));
s->name = tname;
s->sc = tsc;
s->sn = tsn;
r->next = s;
r = s;
cin >> tsn >> tname >> tsc ;
}
r->next = NULL;
return L;
}
void InsertLink(LinkList &L1, LinkList &L2) {
L2->next = L1->next;
L1->next = L2;
}
void display(LinkList L) {
for (LNode *p = L -> next; p != NULL; p = p -> next)
cout << p -> sn << " " << p->name << " " << p->sc << endl;
cout << endl;
}
这个返回值 3221226356 在 Windows 平台上通常是由于程序发生了访问非法内存的错误,也就是所谓的“段错误”(Segmentation Fault)。
经过查看代码,可能存在以下问题:
在函数 List_HeadInsert
中,你已经为头结点 L
分配了空间,却又在循环内部重新分配结点空间并且没有释放。这会导致内存泄漏和无法预料的错误。建议将头结点初始化放到 InitList
函数中。
在函数 display
中,当 L 为空链表时,循环内部会出现对 NULL 指针的访问,这也会导致非法访问内存的问题。可以添加判断语句来避免这种情况。
在输入数据时,没有判断是否已经读入完毕,如果输入完最后一个结点后没有及时退出,会进入死循环,导致程序崩溃。
根据以上问题,下面给出修改后的代码:
#include <iostream>
#include <cstring>
using namespace std;
typedef int ElemType;
typedef struct LNode {
ElemType sn;
ElemType sc;
string name;
struct LNode *next;
} *LinkList, LNode;
void InitList(LinkList &L);
LinkList List_HeadInsert(LinkList &L);
void InsertLink(LinkList &L1, LinkList &L2);
void display(LinkList L);
int main() {
LinkList L1;
InitList(L1);
List_HeadInsert(L1);
display(L1);
return 0; // 程序结束
}
void InitList(LinkList &L) {
L = (LNode *)malloc(sizeof(LNode));
L->next = NULL;
}
LinkList List_HeadInsert(LinkList &L) {
ElemType tsn, tsc;
string tname;
LNode *s, *r = L;
while (cin >> tsn >> tname >> tsc) { // 添加输入判断条件,如果输入完毕就退出循环
s = (LinkList)malloc(sizeof(LNode));
s->name = tname;
s->sc = tsc;
s->sn = tsn;
r->next = s;
r = s;
}
r->next = NULL;
return L;
}
void InsertLink(LinkList &L1, LinkList &L2) {
L2->next = L1->next;
L1->next = L2;
}
void display(LinkList L) {
if (L == NULL || L->next == NULL) { // 当链表为空或只有头结点时退出函数
return;
}
for (LNode *p = L->next; p != NULL; p = p->next)
cout << p->sn << " " << p->name << " " << p->sc << endl;
cout << endl;
}
希望这些修改能够帮助你解决问题。
数据结构对单链表进行数据排序 http://bbs.csdn.net/topics/392201633