티스토리 뷰

SLL

 

#include <stdio.h>
#include <stdlib.h>
int in;
//node 구조체정의
struct node {
    int data;
    struct node *next;
};
struct node* head = 0;
 
 
//sLL에 추가하는함수
void addToSLL(int data)
{
    struct node *cur;
    cur = (struct node*)malloc(sizeof(struct node));
    cur->data = data;
    cur->next = 0;
 
    //1.SLL이 empty
    if (head == 0) {
 
        head = cur;
        return;
    }
    //2 else
    //2.1끝을찾자
    //2.2끝에 붙이자
    {
        struct node* lastnode = head;
        while (lastnode->next != 0)
        {
            lastnode = lastnode->next;
        }
        lastnode->next = cur;
        return;
    }
}
 
 
/* SLL에 삽입하는함수
where 을 찾아서 그뒤에 what을 추가
where가 없으면 맨앞에 what을 추가*/
void insertToSLL(int where, int what)
{
    //1.where를찾자
    struct node *wp = head;
 
    while (1) {
 
        if (wp == 0) {
            break;
        }
        if (wp->data == where) {
            break;
        }
        wp = wp->next;
    }
 
    {
 
        struct node *cur;
        cur = (struct node *)malloc(sizeof(struct node));
        cur->data = what;
        cur->next = 0;
 
        if (wp == 0) { // where를 가진 노드가 없으므로 맨앞에 추가
 
            cur->next = head;
            head = cur;
            return;
        }
        else { //where를 찾았으므로 뒤에 추가
 
            cur->next = wp->next;
            wp->next = cur;
        }
    }
}
 
//data를 찾아서 삭제
void delFromSLL(int data)
{
 
    struct node *cur = head;
    while (1) {  // 찾는다
        if (cur == 0) {
            break;
        }
        if (cur->data == data) {
            break;
        }
        cur = cur->next;
    }
 
    if (cur == 0) { //지울 것을 못 찾았음
 
        return;
    }
    {
        //1. 맨 앞의 것을 가리키는 경우
        if (cur == head) {
            head = head->next;
            free(cur);
            return;
        }
        else { //2. 아닌경우
            struct node *prev = head; //previous
            while (prev->next != cur) { // prev 가 cur 를가리켜야하므로 찾는다
                prev = prev->next;
            }
            prev->next = cur->next;
            free(cur);
            return;
        }
 
    }
}
 
// 위치를 찾아서 삭제
void DelLocation(int n)
{
    int i;
    struct node* find = head;
    if (n == 1) {
        delFromSLL(head->data);
        return;
    }
    if (n != 1) {
        for (i = 1; i < n; i++) {
            find = find->next;
        }
    }
    delFromSLL(find->data);
    return;
}
 
//완전삭제
void destroySLL()
{
 
    struct node *cur = head;
 
    while (1) {
        if (cur == 0) {
            return;
        }
        head = head->next;
        free(cur);
        cur = head;
    }
}
void destroyReverse()
{
    struct node *cur;
    while (1) {
        cur = head;
        if (head->next == 0) { //노드가 하나남게될 경우
            free(head);
            head = 0;
            return;
        }
        while (cur->next->next != 0) {
            cur = cur->next;
        }
        free(cur->next);
        cur->next = 0;
    }
}
 
//SLL에 들어있는 데이터를 앞에서부터 차례로출력
void showSLL()
{
    struct node *cur = head;
 
    while (cur != 0) {
        printf("%d ", cur->data);
        cur = cur->next;
    }
    return;
}
 
int main(void)
{
    int i;
    int num;
    scanf("%d", &in);
    for (i = 0; i < in; i++) {
        scanf("%d",&num);
        addToSLL(num);
    }
    scanf("%d", &num);
    if (num > in || num < 1) {
         
    }
    else {
        DelLocation(num);
    }
    showSLL();
 
    return 0;
}
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31