동적 체인 테이블의 삭제 수정, 인쇄 삭제 등 기본 조작 및 코드 모듈화(완전 C 언어 코드!)

먼저 체인 테이블의 기본 지식을 소개한 다음에 프로그램을 통해 체인 테이블 조작의 기본 기능을 실현하고 삭제, 수정, 인쇄 등 조작을 증가하며 모듈화로 이 부분의 지식을 심화시킨다.
연쇄표 기초 지식
1. 메모리 그림으로 전개(1) 체인 테이블에'헤드 포인터'변수가 있는데'헤드 포인터'를 제공하지 않으면 전체 체인 테이블에 접근할 수 없다.(2) 체인 테이블의 모든 요소는'결점'이 되고 모든 결점은 데이터와 다음 결점의 주소를 포함한다.끝의 결점 주소 부분은 NULL(빈 주소)입니다.(3) 체인 테이블의 원소가 메모리에 있는 주소는 연속되지 않을 수 있다.
2. 체인 테이블의 구축(1) 정적 체인 테이블: 모든 결점은 프로그램에서 정의된 것으로 임시로 개척된 것이 아니며 다 사용한 후에 방출할 수 없다.(2) 동적 체인 테이블: 프로그램 실행 과정에서 무에서 유로 하나의 체인 테이블을 구축한다. 즉, 하나하나 결점을 개척하고 각 결점 데이터를 입력하며 전후 체인의 관계를 구축한다.
3. 체인 시계의 기본 조작이 이 코드를 쓸 때 중간에 하나의while가if라고 썼기 때문에 정말 마지막 테스트가 계속 틀렸어요. 정말 취했어요!!!온전한 코드를 동봉합니다.틀린 점은 바로잡아 주세요~ 테스트해 보면 틀림없습니다.
#include <stdio.h>
#include <stdlib.h>

typedef int Datatype;   //                   

typedef struct node {
    Datatype data;
    struct node *next;
}Node;

//    
Node* creatNode(Datatype data) {
    Node* p = NULL;
    p = (Node*)malloc(sizeof(Datatype));    //    
    if (p == NULL) {    //    
        return NULL;
    }
    p->data = data;     //  
    p->next = NULL;
    return p;
}
//    
void printList(Node* head) {
    Node* p = head;
    if (head == NULL) {
        return;
    }
    while(p != NULL) {
        printf("%d
"
,p->data); p = p->next; } return; }
//           
int insertNodeBehind(Node* p,Node* pnew) {
    if (p == NULL || pnew == NULL) {
        return -1;
    }
    if (p->next != NULL) {
        pnew->next = p->next;
        p->next = pnew;
    }
    else {
        p->next = pnew;
    }
/*       
    pnew->next = p->next;
    p->next = pnew;
     ,   p->next = NULL pnew->next = NULL*/
    return 0;  
}
//         
int insertDataBehind(Node *p,Datatype data) { Node* pnew = NULL; if (p == NULL) { return -1; }
    pnew = creatNode(data);
    insertNodeBehind(p,pnew);
    return 0;
}
//           
Node* findListTail(Node* phead) {
    if (phead == NULL) {
        return NULL;
    }
    while (phead->next != NULL) {
        phead = phead->next;
    }
    return phead;
}
//          ,**             ,         
int listInsertDataAtTail(Node** phead,Datatype data) {
    Node *p = NULL;
    if (phead == NULL) {
        return -1;
    }
    if (*phead == NULL) {
        *phead = creatNode(data);
        return 0;
    }
    p = findListTail(*phead);
    insertDataBehind(p,data);
    return 0;
}

//       
int deleteNodeBehind(Node* p) {
    Node* temp  = NULL;
    if (p == NULL) {
        return -1;
    }
    if (p->next == NULL) {
        return 1;
    }
    temp = p->next;
    p->next = p->next->next;
    free(temp);
    return 0;
}
//     data      
Node* findNode(Node* head,Datatype data) {
    Node* p = NULL;
    if (head == NULL) {
        return NULL;
    }
    p = head;
    while (p->data != data) {
        if (p->next != NULL) {
            p = p->next;
        }
        else {
            return NULL;    //       data   
        }
    }
    return p;
}
//   
int listChangeData(Node* head,Datatype oldData,Datatype newData) {
    Node* p = NULL;
    if (head == NULL) {
        return -1;
    }
    p = findNode(head, oldData);
    p->data = newData;
    return 0;
}
//     data            
Node* findPrevNode(Node *head,Datatype data) {
    Node* p = NULL;
    if (head == NULL) {
        return NULL;
    }
    p = head;
    while (p->next != NULL) {
        if (p->next->data == data) {
            return p;
        }
        else {
            p = p->next;
        }
    }
    return NULL;
}
//           data   
int listDeleteData(Node** phead,Datatype data) { Node* p = NULL; Node* temp = NULL; if (phead == NULL || *phead == NULL) { return -1; }
    if ((*phead)->data == data) { temp = (*phead); (*phead) = (*phead)->next; free(temp); return 0; }
    p = findPrevNode(*phead, data);
    deleteNodeBehind(p);
    free(temp);
    return 0;
}
//    
int listDestroy(Node **phead) {
    if (phead == NULL || (*phead) == NULL) {
        return 0;
    }
    while ((*phead)->next != NULL) { deleteNodeBehind(*phead); } (*phead) = NULL; free(*phead); //          ! return 0; }
int main(int argc, const char * argv[]) {
//     ,  ,    
    Node* p = NULL;
    listInsertDataAtTail(&p, 1); //   creatNode,findListTail,insertNodeBehind
    printList(p);

    listInsertDataAtTail(&p, 2);
    listInsertDataAtTail(&p, 3);
    listInsertDataAtTail(&p, 4);
    listInsertDataAtTail(&p, 5);

    printf("    :1-2-3-4-5
"
); printList(p); // // printf(" 1
");
// listDeleteData(&p, 1); // listDeleteData(&p, 3); // printList(p); // printf(" 2 20000
"
); listChangeData(p, 2, 20000); printList(p); listDestroy(&p); printList(p); return 0; }

output:
1
    :1-2-3-4-5
1
2
3
4
5
  2 20000
1
20000
3
4
5

드디어 됐어~ 쉬었어, 쉬었어~ 잘자~ 구경꾼은 많지 않지만 천천히 써볼게, 요즘은 이렇게 써보니까 수확이 많네. 아무래도 다른 사람한테 보여줘야 돼. (아무도 없지만ㅋㅋㅋㅋㅋ) 지식도 좀 빠뜨렸어~ 계속 화이팅!사람이 생기면 의견을 많이 내주세요 여러분 소~ 감사합니다

좋은 웹페이지 즐겨찾기