[혼연C] 단순연결리스트 예제 컴파일이 안돼서...

혼자 연구하는 C/C++의 단순 연결 리스트를 혹시나 싶어서 코딩해봤는데 오류를 뿜으며 컴파일이 안되더라. OSX환경이라 그런 것인지 아니면 이곳의 예제가 C++ 컴파일러여야 하는것인지, 아님 내가 그저 gcc(Apple LLVM)로 컴파일을 해서 문제가 있는 것인지는 모르겠다. 아무튼 구조체 태그를 가지고 새로운 변수를 선언/정의할 때, C에서는 일일이 struct를 붙여줘야 한다. 그냥 데이터 타입처럼 바로 쓰는 건 C++이 허용하는 문법이라고.
그래서 다시 작성함. 도대체 어디가 문제인지 좀 헤맸는데 의외로 엄청 친절하고 꼼꼼한 선생님이 계셨으니… 바로 Xcode… vi로 코딩하다 머리 뜯으며 Xcode로 옮겨보니 바로 알려주시네. 다음 코드는 오류나 경고를 모두 제거하고 표준 C로 재작성된 코드.

//  Simple Linked List
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node {
    int value;
    struct Node *next;
};
struct Node *head;
void initList()
{
    head = (struct Node*)malloc(sizeof(struct Node));
    head->next = NULL;
}
struct Node* insertNextTo(struct Node* target, struct Node* newNode)
{
    struct Node *new;
    new = (struct Node*)malloc(sizeof(struct Node));
    *new = *newNode;
    new->next = target->next;
    target->next = new;
    //free(newNode);
    return new;
}
unsigned int removeNextTo(struct Node* target)
{
    struct Node *del;
    del = target->next;
    if(del==NULL) {
        return 0;
    }
    target->next = del->next;
    free(del);
    return 1;
}
void releaseList()
{
    while(removeNextTo(head)){;}
    free(head);
    head=NULL;
}
int main(int argc, const char *argv[])
{
    initList();
    struct Node *now, temp;
    now = head;
    int i;
    for(i=1;i<=5;i++){
        temp.value = i;
        now = insertNextTo(now, &temp);
    }
    removeNextTo(head->next);
    for(now=head->next;now;now=now->next)
    {
        printf("%02d ==>", now->value);
    }
    return 0;
}

다음과 같이 typedef를 쓰는 경우에 조금 애매한 부분이 있는데 typedef 로 구조체를 타입으로 만들 때 그 구조체가 자신을 가리키는 포인터를 멤버로 가지면, 그 때의 자신은 그냥 구조체의 포인터로 써야한다. (타입의 포인터를 쓰면 에러.)
아래와 같이 변경된다.

//  Simple Linked List
//
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct __node {
    int value;
    struct __node *next;
} node;
node *head;
void initList()
{
    head = (node*)malloc(sizeof(node));
    head->next = NULL;
}
node* insertNextTo(node* target, node* newNode)
{
    node *new;
    new = (node*)malloc(sizeof(node));
    *new = *newNode;
    new->next = target->next;
    target->next = new;
    //free(newNode);
    return new;
}
unsigned int removeNextTo(node* target)
{
    node *del;
    del = target->next;
    if(del==NULL) {
        return 0;
    }
    target->next = del->next;
    free(del);
    return 1;
}
void releaseList()
{
    while(removeNextTo(head)){;}
    free(head);
    head=NULL;
}
int main(int argc, const char *argv[])
{
    initList();
    node *now, temp;
    now = head;
    int i;
    for(i=1;i<=5;i++){
        temp.value = i;
        now = insertNextTo(now, &temp);
    }
    removeNextTo(head->next);
    for(now=head->next;now;now=now->next)
    {
        printf("%02d ==>", now->value);
    }
    return 0;
}

p.s. 구조체를 타입으로 선언하고 그 속에서 구조쳬 자신의 포인터를 지칭할 때는 구조체 이름과 타입 이름이 같은 것으로 간주되나, 가능하면 내부적으로 구분하여 사용하는 것이 조금 더 낫고. (왜냐하면 뒤에서 구조체 태그인지 타입명인지를 구분해야 할 때가 있으므로) 이를 구조체 내에서 명시하는 것이 좋다.
 

Read more

워드프레스에서 고스트로 이전

워드프레스에서 고스트로 이전

이 글을 쓰면서도 믿기 힘든 사실인데, 블로그라는 걸 처음 시작한지가 20년이 되었습니다. 이글루스에서 처음 시작했다가, SK컴즈가 인수한다고 발표함과 동시에 워드프레스로 플랫폼을 옮겼죠. 워드프레스오 옮긴 이후에는 호스팅 환경을 이리 저리 옮기긴 했지만 거의 18년 가까이 워드프레스를 사용해온 것 같습니다. 그 동안 워드프레스는 블로깅 툴에서 명실상부한 범용CMS로 발전했습니다. 사실 웬만한 홈페이지들은 이제

By sooop
띄어쓰기에 대한 생각

띄어쓰기에 대한 생각

업무 메일을 쓸 때 가장 많이 쓰는 말 중에 하나가 메일 말미에 ‘업무에 참고 부탁 드립니다.‘인데요, 어느 날부터 아웃룩에서 이 ‘부탁 드립니다’가 틀렸다고 맞춤법 지적을 하기 시작했습니다. 맞는 말은 ‘부탁드립니다’라고 붙여 쓰는 거라고. 사실 아래아한글 시절부터 이전의 MS워드까지, 워드프로세서들의 한국어 맞춤법 검사 실력은 거의 있으나 마나 한

By sooop

구글 포토에서 아이클라우드로 탈출한 후기

한 때 구글 포토가 백업 용량을 무제한으로 제공해 주겠다고해서, 구글 포토를 사용해서 사진을 백업해왔습니다. 물론 이 이야기의 결말은 저나 이 글을 읽고 있는 여러분이나 모두 알고 있습니다. 사실 AI에게 학습 시킬 이미지 데이터를 모으기 위한 것일 뿐이라거나 하는 이야기는 그 당시에도 있었습니다만, 에이 그래도 구글인데 용량은 넉넉하게 주겠지…하는 순진한

By sooop

Julia의 함수 사용팁

연산자의 함수적 표기 Julia의 연산자는 기본적으로 함수이며, 함수 호출 표기와 같은 방식으로 호출하는 것이 가능합니다. 또한 그 자체로 함수이기 때문에 filter(), map() 과 같이 함수를 인자로 받는 함수에도 연산자를 그대로 적용하는 것이 가능합니다. 특히 + 연산자는 sum() 함수와 같이 여러 인자를 받아 인자들의 합을 구할 수 있습니다. 2 + 3 # = 5 +(2,

By sooop