c 언어 구현 단 방향 순환 링크

/ / 단일 순환 링크, 단일 체인 시트 를 바탕 으로 하나의 노드 를 만 들 때마다 후계 기본 방향 head
/ / 마지막 노드 의 후계 지향 헤드 는 단일 순환 링크 를 구성 합 니 다.
/ / 앞장 서지 않 는 노드 판 공: head = = NULL / / 앞장 서 는 노드 판 공: head->next == head; 빈 / / 와 단일 링크 코드 의 차이 점: 매번 순환 하 는 점프 조건 이 바 뀌 고 꼬리 삽입 이 바 뀝 니 다.  //프로그램 에 노드 를 삽입 하 는 것 이 헤드 노드 라면 꼬리 노드 의 방향 을 업데이트 해 야 합 니 다.
/ / 머리 노드 를 삭제 하고 꼬리 노드 의 방향 을 업데이트 하 며 꼬리 노드 를 삭제 하고 이전 노드 의 방향 을 업데이트 합 니 다.
독 자 는 자신 이 단일 체인 표 에서 순환 체인 표 까지 수 동 으로 한 번 실현 하 는 것 을 권장 합 니 다. 순환 체인 표 의 이 치 는 매우 간단 합 니 다.
그러나 그 중의 많은 세부 사항, 특히 삽입, 삭제, 그리고 머리 결점, 꼬리 노드 의 처리 등 눈 에 띄 지 않 는 문제 가 존재 하 는 지, 아니면 한 번 두 드 리 는 것 이 진실 입 니까?
단 방향 순환 링크 는 단일 체인 표 중의 일부 기능 을 선택 하여 실현 했다. 독자 도 이들 을 비교 해 보면 단일 체인 표 의 각종 기능 의 실현 을 볼 수 있다.http://blog.csdn.net/hkhl_235/article/details/78196865
주요 기능:
#include
#include
#include
#include //  sleep    ,       (linux)windows    #include Sleep(2000);
typedef struct node
{
    int no;
    int age;
    char sex[5];
    char name[20];
    struct node *next;
}Node;

void Print(Node *head);     //  
void CreateNode(Node *head, Node **p, int no, int age, char *sex, char *name);//    
void Add(Node **head, int no, int age, char *sex, char *name);    //    
Node *FindNode(Node *head, int no);         //       ,     NULL
Node *PrvNode(Node *head, Node *find);      //      
void SerchNode(Node *head, int no);         //       
void Insert(Node **head);                   //         
void HeadInsert(Node **head, int sid);      //       (    )
void BackInsert(Node **head, int sid);      //       (    )
void DeleteNode(Node **head, int no);       //     no   
void FreeAll(Node **head);                  //    
int GetToatalNode(Node *head);              //      

함수 구현 부분:
void Print(Node *head)
{
    Node *first = head;
    if(head != NULL)
    {
        printf("                          
"); while(head != NULL) { printf("%d %d %s %s %p
", head->no, head->age, head->sex, head->name, head->next); head = head->next; if(head == first) { //sleep(2); // break break ; } } } else { printf("
"); } } void CreateNode(Node *head, Node **p, int no, int age, char *sex, char *name) { *p = (Node *)malloc(sizeof(Node)); if(*p != NULL) { (*p)->no = no; (*p)->age = age; strcpy((*p)->sex, sex); strcpy((*p)->name, name); (*p)->next = head; } else { printf("
"); } } // ,, ... void Add(Node **head, int no, int age, char *sex, char *name) { Node *h = *head; Node *p; if(*head == NULL) { CreateNode(*head, &p, no, age, sex, name); *head = p; // , p->next = *head; // , CreareNode p p->next head , head NULL, . A } else { CreateNode(*head, &p, no, age, sex, name); while(h->next != *head) //while (*->next) { h = h->next; //A, head NULL, } h->next = p; } } // // NULL Node *FindNode(Node *head, int no) { int flag = 0; Node *first = head; while(head) { if(head->no == no) { flag = 1; break; } head = head->next; if(head == first) { break; } } if(flag == 0) { return NULL; } return head; } // Node *PrvNode(Node *head, Node *find) { Node *first = head; while(head) { if(find == head) // { break; } if(head->next == find) { break; } head = head->next; if(head == first) { break; } } return head; } // void Insert(Node **head) { Node *first = *head; printf(" :
"); int no; float age; char sex[5]; char name[10]; scanf("%d%f%s%s", &no, &age, sex, name); Node *q; CreateNode(*head, &q, no, age, sex, name); Node *p1 = *head; Node *p2; int flag = 0; while(p1->no <= no) // NULL { p2 = p1; p1 = p1->next; if(p1 == *head) { flag = 1; break; } } if(p1 == *head && flag != 1) // { q->next = p1; *(head) = q; // for(; p1->next != first; p1 = p1->next); p1->next = *head; } else if(p1 == *head && flag == 1) // { p2->next = q; q->next = *head; } else // { q->next = p2->next; p2->next = q; } } void HeadInsert(Node **head, int sid) // ( ) { Node *first = *head; printf(" :
"); int no; float age; char sex[5]; char name[10]; scanf("%d%f%s%s", &no, &age, sex, name); Node *q; CreateNode(*head, &q, no, age, sex, name); Node *p1 = FindNode(*head, sid); Node *p2 = PrvNode(*head, p1); if(p1 == *head) // { q->next = p1; *(head) = q; // for(; p1->next != first; p1 = p1->next); p1->next = *head; } else // { q->next = p2->next; p2->next = q; } } void BackInsert(Node **head, int sid) // ( ) { printf(" :
"); int no; float age; char sex[5]; char name[10]; scanf("%d%f%s%s", &no, &age, sex, name); Node *q; CreateNode(*head, &q, no, age, sex, name); Node *p1 = FindNode(*head, sid); Node *p2 = p1->next; if(p1->next == *head) // { p1->next = q; q->next = *head; } else // { q->next = p1->next; p1->next = q; } } // no void DeleteNode(Node **head, int no) { Node *first = *head; Node *p1, *p2; p1 = p2 = NULL; p1 = *head; while(p1) // { if(p1->no == no) { break; // , p1 , p1 NULL // } p2 = p1; p1 = p1->next; if(p1 == *head) { break; } } if(p1 == *head) // { (*head) = p1->next; // // Node *p = p1; for(; p->next != first; p = p->next); p->next = *head; free(p1); // } else // { p2->next = p1->next; free(p1); } } void SerchNode(Node *head, int no) // { Node *sr = FindNode(head, no); if(sr != NULL) { printf("%d %d %s %s %p
", sr->no, sr->age, sr->sex, sr->name, sr->next); } else { printf("
"); } } // // void FreeAll(Node **head) { Node *p1 = *head; Node *p2 = NULL; Node *q = NULL; while(p1->next == *head) { p2 = p1->next; p1->next = p2->next; free(p2); } free(*head); *head = NULL; } int GetToatalNode(Node *head) // { int num = 0; Node *first = head; if(head != NULL) { while(head != NULL) { num++; head = head->next; if(head == first) { break; } } } return num; }

다음은 테스트 코드:
int main()
{
    Node *head = NULL;

    Add(&head, 1002, 17, " ", " 2");
    Add(&head, 1001, 15, " ", " 1");
    Add(&head, 1003, 12, " ", " 3");
    Add(&head, 1004, 21, " ", " 4");
    Add(&head, 1005, 22, " ", " 5");
    Print(head);
    

    printf("     1005    :
"); DeleteNode(&head, 1002); Print(head); printf("
: %d

", GetToatalNode(head)); printf(" ( ):
"); printf("( ) , , , :
"); HeadInsert(&head, 1002); Print(head); printf("( ) , , , :
"); BackInsert(&head, 1004); Print(head); printf(" ( ):
"); printf(" , , , :"); Insert(&head); Print(head); printf(" :
"); FreeAll(&head); Print(head); return 0; }

문제 가 있 으 면 지적 을 환영 합 니 다. 공동 발전!
단일 체인 표 의 각종 기능 의 실현:http://blog.csdn.net/hkhl_235/article/details/78196865

좋은 웹페이지 즐겨찾기