2021. 3. 5. 08:58 c언어
C언어 - 링크리스트
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
struct node {
char* name;
struct node* link;
};
int getname(char*);
struct node* addlist(struct node*, char*);
char* namecopy(char*);
void listprint(struct node*);
struct node* invert(struct node*);
int main()
{
struct node* root;
char name[80];
root = NULL;
while (getname(name) != EOF)
root = addlist(root, name);
listprint(root);
root = invert(root); //함수 콜
printf("------- invert ------\n");
listprint(root); //역순화된 연결 리스트 출력
return 0;
}
int getname(char* pname)
{
int i = 0; char c;
while (((c = getchar()) != '\n') && c != EOF)
*(pname + i++) = c;
if (c == '\n')
*(pname + i) = '\0';
if (c == EOF)
*pname = EOF;
return *pname;
}
struct node* addlist(struct node* p, char* w)
{
if (p == NULL) {
p = (struct node*)malloc(sizeof(struct node));
p->name = namecopy(w);
p->link = NULL;
}
else
p->link = addlist(p->link, w);
return p;
}
char* namecopy(char* s)
{
char* p; int i = 0;
p = (char*)malloc(strlen(s) + 1);
while ((*(p + i) = *(s + i)) != '\0') i++;
return p;
}
void listprint(struct node* p)
{
while (p != NULL) {
printf("%s\n", p->name);
p = p->link;
}
}
struct node* invert(struct node* lead) {
struct node * middle, * trail;
middle = NULL;
while (lead != NULL) {
trail = middle;
middle = lead;
lead = lead->link;
middle->link = trail;
/* trail = lead;
lead = lead->link;
trail->link = middle;
middle = trail;*/
//되긴한데 정석은 아님
}
return middle;
}
'c언어' 카테고리의 다른 글
C언어 - Command line argument 를 사용 (0) | 2021.03.08 |
---|---|
C언어 - 이진탐색트리 과제 (0) | 2021.03.06 |
C언어 - 두 단어의 크기를 비교하기(숫자일경우 숫자로 비교) 2 (0) | 2021.03.05 |
C언어 - 두 단어의 크기를 비교하기(숫자일경우 숫자로 비교) (0) | 2021.03.05 |
C언어 - 특정 글자 지우고 단어 반대로 출력하기 (0) | 2021.03.04 |