c·c++/c 프로그래밍

간단한 연결리스트

바로이순간 2013. 10. 28. 16:41

#include <stdio.h> 

#include <string.h> 

#include <stdlib.h>

// 노드 구조체의 포인터 pnode

typedef struct node *pnode;

// 정수 data 다음 구조체 포인터 next 

typedef struct node { 

    int   data;

    pnode next; 

} node; 

typedef struct linkedList *plist;

typedef struct linkedList {

    pnode head;

    pnode tail;

} linkedList;  

// 새노드를 만들고 포인터를 NULL로 초기화 시킨다.

pnode makeNode(int);

// 정수를 입력받아 삽입한다.

// 노드들은 입력받은 순서대로 되어있다.

void insertNode(plist, int);

// 노드들을 출력해 준다. 

void showList(plist); 

// 모든 노드들을 삭제한다.

void quitNode(plist); 

int main() { 

    // 연결 리스트 list

    plist list;

    // 메뉴선택을 위한 변수, 7을 입력하면 종료한다.

    int menu=1, data; 


    // 리스트를 초기화한다. 더미 노드를 한개 만들어서 head와 tail이 이 노드를 가리키게 한다.

    // 이렇게 해서 항상 실제로 가리키기를 원하는 노드 보다 앞의 노드를 가지고 찾아다니면

    // 어떤 위치에서든디 삽입과 삭제를 할 수 있다.

    // 또 이중 포이터를 사용해야하는 번거러움을 피할 수가 있다.

    // head는 리스트의 시작하는 노드(항상 더미노드)를 가리킨다.

    // tail은 리스트의 맨 마지막 노드를 가리킨다. 처음에는 더미노드를 가리키다가,

    // 실제로 노드가 삽입되면 가장 나중에 삽입된 노드를 가리키게 된다.

    // tail 을 이용해서 우리는 새로 삽입되는 노드를 가장 뒤에 바로 삽일할 수 있다.

    list=(plist)malloc(sizeof(linkedList));

    list->head=makeNode(0);

    list->tail=list->head;


    // 메뉴를 보여주고 선택을 입력 받는다.

    while(menu!=3) { 

        puts("*************"); 

        puts("* 1. 입력: "); \

        puts("* 2. 출력:"); 

        puts("* 3. 끝내기"); 

        puts("*************"); 

        printf("선택="); 

        scanf("%d", &menu); 

        fflush(stdin); 

        switch(menu) { 

            case 1: 

                // 삽입

                printf("data: ");

                scanf("%d", &data);

                insertNode(list, data); 

                break; 

            case 2: 

                // 전체출력

                showList(list); 

                break; 

            case 4: 

                // 종료

                quitNode(list); 

                break; 

        } 

    }

    // 마지막으로 list를 free시킨다.

    free(list);


    return 0;

// 새노드를 만든다.

pnode makeNode(int n) { 

    pnode p;


    p=(pnode)malloc(sizeof(node));

    p->data=n;

    p->next=NULL;

    return p;

}

// 넘어온 data로 만든 새노드를 삽입한다.

void insertNode(plist list, int data) {

    pnode t=list->head; 

    pnode newnode = makeNode(data); 

    list->tail->next=newnode;

    list->tail=newnode;


// 전체 리스트를 출력한다.

void showList(plist list) {

    pnode t = list->head; 

    while(t->next) {

        printf("%d ", t->next->data); 

        t = t->next; 

    } 

    printf("\n");

// 리스트의 모든 노드를 삭제한다.

void quitNode(plist list) { 

    pnode t=list->head;

    pnode temp;

  

    while(t->next) {

        temp = t->next;

        t=t->next; 

        free(temp); 

    } 

    free(list->head);

}

'c·c++ > c 프로그래밍' 카테고리의 다른 글

유사완전수,괴짜수  (0) 2013.12.01
힙정렬  (0) 2013.11.11
n보다 작은 소수 출력하기  (0) 2013.10.26
infix to postfix and eval (중위표현을 후위표현으로 바꾸고 값 구하기)  (0) 2013.10.26
파일 expand  (0) 2013.10.25