연결리스트에 대한 질문입니다...

ch0nn0m의 이미지

채팅방을 만들고 귓말까지 가능한걸 만들어 보려다가...
연결리스트를 사용해보려 했는데...아직 연결리스트에 대한 이해가 많이 부족한것 같더라구요...
그래서 C로 어떻게 돌아가는지 만들어 보려는데 이해가 잘안가네요...

밑에와 같이 단일연결리스트를 구성했는데요...각각의 채널안에 유저를 저장하구...
각채널마다의 저장된 유저를 출력해보고 싶은데요...자꾸 이상하네요...
소스코드 일부만을 올려놓았습니다...혹시 어디가 문제인지...?

 
typedef struct _user
{
        char u_name[20];
        struct _user *u_next;
}user;
user *u_head, *u_tail;
 
typedef struct _channel
{
        int user_count;
        char channel_name[20];
        struct _channel *c_next;
        struct _user *user;
}channel;
channel *c_head, *c_tail;
 
void init_user(void)
{
        u_head=(user*)malloc(sizeof(user));
        u_tail=(user*)malloc(sizeof(user));
        u_head->u_next=u_tail;
        u_tail->u_next=u_tail;
}
void init_channel(void)
{
        c_head=(channel*)malloc(sizeof(channel));
        c_tail=(channel*)malloc(sizeof(channel));
        c_head->c_next=c_tail;
        c_tail->c_next=c_tail;
}
 
 
//문자열을 받아와서 채널생성
 
void create_channel(char *s)
{
        printf("새로운 채널 생성했습니다\n");
        channel *t;
        t=(channel*)malloc(sizeof(channel));
        strcpy(t->channel_name,s);
        t->c_next=c_head->c_next;
        c_head->c_next=t;
        t->user_count=0;
}
 
 
//유저와 채널이름을 받아서 실행하는 함수
 
//같은 채널이라면 그 채널안의 구조체에 연결된 유저이름에 저장
 
void have_channel(char *ur_name,char *cl_name)
{
        user *t;
        channel *p;
        p=(channel*)malloc(sizeof(channel));
        p=c_head->c_next;
        p->user=(user*)malloc(sizeof(user));
 
        while(strcmp(cl_name,p->channel_name) !=0 && p!=c_tail)
        {
                p=p->c_next;
        }
        p->user_count++;
        strcpy(p->user->u_name,ur_name);
        p->user->u_next=u_head->u_next;
        u_head->u_next=p->user;
}
 
 
//채널정보검색
 
        printf("정보를 알고 싶은 채널 : \n");
        fgets(buf,20,stdin);
        buf[(strlen(buf)-1)]='\0';
        channel *p;
        user *t;
        p=c_head->c_next;
        p->user=u_head->u_next;
        while(strcmp(buf,p->channel_name) !=0 && p!=c_tail)
        {
                  p=p->c_next;
        }
        if(p==c_tail)
        {
         printf("찾으시는 채널이 없습니다\n");
         return 1;
        }
        while(p->user_count--)
 
         {
         printf("%s\n",p->user->u_name);
         p->user=p->user->u_next;
        }

nagahunt의 이미지

모든 channel 이 하나의 user 리스트를 공유하게 만들어지는듯 합니다.
user 정보를 저장하는 자료구조가 channel 별로 만들어지지 않고 전역으로 만들어지고 있네요.
실력없는 제가 보기엔 자료구조 설계부터 다시 하셔야 할듯....

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.