我正在使用这两种结构,第一种保存员工信息,第二种保存列表信息:
typedef struct ListNodeTag{
int idNumber;
struct ListNodeTag *next;
} Employee;
typedef Employee Item;
typedef struct {
int size;
Item *head;
} List;
当程序启动时,使用此函数初始化列表:列表在我的main中声明为 List L ;并且被称为:初始化(& L);
void Initialize (List *L) {
L->size = 0;
L->head = NULL;
}
从这里,我可以正确地将列表大小设置为0。
然后我继续使用这两个函数将Employee添加到列表中。第一个(EmployeeCreation)创建员工,而第二个(Insert)接受它并将其插入列表。员工在我的主要部门宣布为员工E ;并且像这样称呼 EmployeeCreation(XXX,& E);
void EmployeeCreation (int idNumber, Employee *E) {
E->idNuber = idNumber;
E->next = NULL;
}
void Insert (Item X, int position, List *L) {
int i;
Item *currentPtr,*previousPtr;
if(L->head == NULL)
L->head = &X;
else{
currentPtr = L->head;
for(i=0;i<position;i++){
previousPtr = currentPtr;
currentPtr = currentPtr->next;
}
previousPtr->next = &X;
X.next = currentPtr;
L->size = L->size + 1;
}
}
使用4个ID的测试文件运行时。第一个是正确读入并保存到列表中。第二个,替换第一个,列表的长度增加1(我理解这一部分)。在此之后,程序Seg Faults。我的程序中会出现这种错误?即使插入函数想要覆盖已占用的位置,我认为它应该腾出空间并且在新位置缝合。
答案 0 :(得分:2)
您要将本地变量(item X
)的地址指定给L->head
L->head = &X;
当您从Insert
退出时,L->head
指向垃圾,因为X
不再可访问,要解决此问题,您可以:
void Insert (Item *X, int position, List *L) {
...
L->head = X;
...
}
Item *temp = malloc(sizeof(Item));
Insert(temp, ..., ...);
...
free(temp);
答案 1 :(得分:1)
你走了:
void Insert (Item X, int position, List *L) {
int i;
Item *currentPtr,*previousPtr;
Item *newX = malloc(sizeof(Item);
newX->idNunmber - X.idNumber;
newX->next = NULL;
if (L->head == NULL) {
L->head = newX;
} else {
currentPtr = L->head;
previousPtr = NULL;
for(i=0;currentPtr!= NULL && i<position;i++) {
previousPtr = currentPtr;
currentPtr = currentPtr->next;
}
newX->next = currentPtr;
previousPtr->next = newX;
L->size +=1;
}
}
答案 2 :(得分:0)
在插入功能中,您可以简化此部分并检查 -
else{
currentPtr = L->head;
for(i=0;i<position;i++){
currentPtr = currentPtr->next;
}
Item *nextItm = currentPtr.next;
currentPtr.next = &X;
X .next = nextItm ;
L->size = L->size + 1;
}