سؤال

يتم إنشاء عقد قائمة مرتبطة بشكل مضاعف في الوظيفة الرئيسية.إندر ورأس تعريف.فواصل في وظيفة عقدة الحذف-إندر فارغ.

ما هي أفضل طريقة لتحرير ذاكرة الإدخال الأخير والأول ، أي.:يحذف:233, و 888, و?

#include <stdafx.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>

typedef struct record {
    int idnumber;
    char initial;
    struct record *prevStudent;
    struct record *nextStudent;
} STUDENT;

STUDENT *header = NULL;  //pointer to the start of linked list
STUDENT *ender = NULL;   //pointer to the end of the linked list

void Makenode(int x, char y);
void deletenode();

int main() {
    Makenode(233, 'A');
    Makenode(456, 'H');
    Makenode(746, 'G');
    Makenode(888, 'F');
    deletenode();

    fflush(stdin);
    getchar();
    return 0;
}

void Makenode(int x, char y) {
    STUDENT *ptr;

    ptr = (STUDENT *)malloc(sizeof(STUDENT));
    if (ptr != NULL) {
        ptr->idnumber = x;
        ptr->initial = y;
        ptr->nextStudent = header;
        ptr->prevStudent = NULL;

        if (header == NULL)
            ender = ptr;
        else
            header->prevStudent = ptr;

        header = ptr;

    } else {
        printf("Memory not allocated\n");
    }
}

void deletenode() {
    //delete the first and the last node of the linked list
    STUDENT *p = header, *q = ender;
    char c;

    printf("Are you sure you want to delete Y/N:\n");
    fflush(stdin); c=getchar();
    while (c == 'Y' || c == 'y') {
        ender=ender->nextStudent;
        header=header->prevStudent;
        free(p); free(q);
    }
}   
هل كانت مفيدة؟

المحلول

تترك وظيفة الحذف القائمة المرتبطة في حالة قانونية.في جميع الأوقات (باستثناء مؤقتا داخل وظائف الإدراج والحذف) ، يجب أن يكون ما يلي صحيحا:

  • إذا كان header لاغية ، و ender يجب أيضا أن تكون فارغة والقائمة فارغة.
  • إذا عقدة p لديه رابط غير فارغ إلى p->next, ، ثم p->next->prev == p.
  • وبالمثل ، إذا كانت العقدة p لديه رابط غير فارغ إلى p->prev, ، ثم p->prev->next == p.
  • لا يحتوي الرأس على عقدة سابقة;لا يوجد لدى إندر عقدة تالية.

هذه هي الثوابت في قائمتك المرتبطة.

إذا قمت بفحص الرمز الخاص بك للحذف:

void deletenode()
{
    STUDENT *p = header, *q = ender;

    ender=ender->nextStudent;
    header=header->prevStudent;
    free(p); free(q);
}

يمكنك أن ترى أنك مجرد تعيين header و ender إلى NULL, ، لأن هذا ما ender->nextStudent و header->prevStudent هي.ولكن حتى عكس ذلك لن يساعد ، لأنه يجب عليك تحديث روابط العقد المجاورة.

فيما يلي وظيفتان-واحدة لكل مهمة-تعمل:

void delete_first()
{
    STUDENT *p = header;

    if (p) {
        if (p->nextStudent == NULL) {
            header = ender = NULL;
        } else {
            p->nextStudent->prevStudent = NULL;
            header = p->nextStudent;
        }
        free(p);
    }
}

void delete_last()
{
    STUDENT *p = ender;

    if (p) {
        if (p->prevStudent == NULL) {
            header = ender = NULL;
        } else {
            p->prevStudent->nextStudent = NULL;
            ender = p->prevStudent;
        }
        free(p);
    }
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top