删除链表中指向的节点
Deleting a node being pointed to in a linked list
此函数接收链表作为参数,必须删除列表中元素 DNI 与给定 get_string 的字符串一致的节点,然后删除 return 列表。目前,如果给定的节点是第一个,则该函数运行良好,但如果给定的节点不是第一个,则它总是删除第一个元素并弄乱列表。我应该怎么做才能解决它?
PPACIENTE p_discharge(PPACIENTE pac){
char dni[10];
int u, c=0;
PPACIENTE pAux;
PPACIENTE temp;
pAux=pac;
fprintf(stdout,"Discharge\n\n");
if (pac==NULL)
{
printf("No patients yet\n");
}
else
{
get_string("DNI",9,9,dni);
while(pAux!=NULL){
if(strcmp(pAux->DNI,dni)==0) {
u=1;
break;
}
else{
pAux=pAux->sig;
}
}
if (u==1){
if (pAux->num==1)
{
pac=pAux->sig;
free(pAux);
return pac;
}
else
{
printf("%d\n", pAux->num);
c=pAux->num;
while(pAux->num!=(c-2))
pAux=pAux->sig;
temp=pAux->sig;
pAux->sig=temp->sig;
free(temp);
}
}
else{
printf("Unknown patient\n");
}
}
return pAux;
}
我不明白num
成员的目的,所以我就忽略它了。
为了删除列表的一个元素,你需要一个指向前一个元素的指针,如果有的话,这样前一个元素的next link(称为sig
在你的代码中可以更新。
PPACIENTE p_discharge(PPACIENTE pac){
char dni[10];
int u = 0;
PPACIENTE pAux;
PPACIENTE temp = NULL; // Pointer to previous element of list
pAux=pac;
fprintf(stdout,"Discharge\n\n");
if (pac==NULL)
{
printf("No patients yet\n");
}
else
{
get_string("DNI",9,9,dni);
while(pAux!=NULL){
if(strcmp(pAux->DNI,dni)==0) {
u=1;
break;
}
else{
temp=pAux;
pAux=pAux->sig;
}
}
if (u==1){
if (pAux==pac)
{
// found patient is first on the list
// update head of list
pac=pAux->sig;
}
else
{
// found patient is not the first on the list
// update link in previous element
temp->sig=pAux->sig;
}
free(pAux);
}
else{
printf("Unknown patient\n");
}
}
return pac;
}
在您的代码中,您没有正确处理删除列表中间或最后一个元素的情况。尝试这样的事情,使用 prec
元素告诉您是否要删除第一个元素 (prec=NULL
) 或不 (prec!=NULL
)。
PPACIENT prec = NULL, pAux;
pAux = pac;
if (pac==NULL) {
printf("No patients yet\n");
}
else {
get_string("DNI",9,9,dni);
while (pAux!=NULL) {
if (strcmp(pAux->DNI, dni)==0) {
if (prec==NULL) {// deleting first node
pac = pAux->sig;
pAux->sig = NULL;
free(pAux);
return pac;
}
else if (pAux->next==NULL) { // deleting last node
prec->sig = NULL;
pAux->sig = NULL;
free(pAux);
return pac;
}
else { // deleting a middle node
prec->sig = pAux->sig;
pAux->sig = NULL;
free(pAux);
return pac;
}
}
pAux = pAux->sig;
}
}
printf("Unknown patient\n");
return pac;
此函数接收链表作为参数,必须删除列表中元素 DNI 与给定 get_string 的字符串一致的节点,然后删除 return 列表。目前,如果给定的节点是第一个,则该函数运行良好,但如果给定的节点不是第一个,则它总是删除第一个元素并弄乱列表。我应该怎么做才能解决它?
PPACIENTE p_discharge(PPACIENTE pac){
char dni[10];
int u, c=0;
PPACIENTE pAux;
PPACIENTE temp;
pAux=pac;
fprintf(stdout,"Discharge\n\n");
if (pac==NULL)
{
printf("No patients yet\n");
}
else
{
get_string("DNI",9,9,dni);
while(pAux!=NULL){
if(strcmp(pAux->DNI,dni)==0) {
u=1;
break;
}
else{
pAux=pAux->sig;
}
}
if (u==1){
if (pAux->num==1)
{
pac=pAux->sig;
free(pAux);
return pac;
}
else
{
printf("%d\n", pAux->num);
c=pAux->num;
while(pAux->num!=(c-2))
pAux=pAux->sig;
temp=pAux->sig;
pAux->sig=temp->sig;
free(temp);
}
}
else{
printf("Unknown patient\n");
}
}
return pAux;
}
我不明白num
成员的目的,所以我就忽略它了。
为了删除列表的一个元素,你需要一个指向前一个元素的指针,如果有的话,这样前一个元素的next link(称为sig
在你的代码中可以更新。
PPACIENTE p_discharge(PPACIENTE pac){
char dni[10];
int u = 0;
PPACIENTE pAux;
PPACIENTE temp = NULL; // Pointer to previous element of list
pAux=pac;
fprintf(stdout,"Discharge\n\n");
if (pac==NULL)
{
printf("No patients yet\n");
}
else
{
get_string("DNI",9,9,dni);
while(pAux!=NULL){
if(strcmp(pAux->DNI,dni)==0) {
u=1;
break;
}
else{
temp=pAux;
pAux=pAux->sig;
}
}
if (u==1){
if (pAux==pac)
{
// found patient is first on the list
// update head of list
pac=pAux->sig;
}
else
{
// found patient is not the first on the list
// update link in previous element
temp->sig=pAux->sig;
}
free(pAux);
}
else{
printf("Unknown patient\n");
}
}
return pac;
}
在您的代码中,您没有正确处理删除列表中间或最后一个元素的情况。尝试这样的事情,使用 prec
元素告诉您是否要删除第一个元素 (prec=NULL
) 或不 (prec!=NULL
)。
PPACIENT prec = NULL, pAux;
pAux = pac;
if (pac==NULL) {
printf("No patients yet\n");
}
else {
get_string("DNI",9,9,dni);
while (pAux!=NULL) {
if (strcmp(pAux->DNI, dni)==0) {
if (prec==NULL) {// deleting first node
pac = pAux->sig;
pAux->sig = NULL;
free(pAux);
return pac;
}
else if (pAux->next==NULL) { // deleting last node
prec->sig = NULL;
pAux->sig = NULL;
free(pAux);
return pac;
}
else { // deleting a middle node
prec->sig = pAux->sig;
pAux->sig = NULL;
free(pAux);
return pac;
}
}
pAux = pAux->sig;
}
}
printf("Unknown patient\n");
return pac;