개발/C++

C언어 링크드리스트를 이용한 주소록 만들기

hojak99 2015. 12. 7. 13:43


주소록 (링크드리스트).exe




#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <Windows.h>


typedef struct tagLinkedList

{

char Name[30]; //이름

char Tel[30]; //전화

char Addr[100]; //주소

char Class[20]; //학번 

struct tagLinkedList *next;

}tag, *Tag;


Tag head=NULL, tail, ptr, p, prev;


void Add_node(); //노드 추가, 생성

void Insert_node(); //노드 삽입

void Print_node(); //노드 출력

void Edit(); //노드 수정

void Delete_node(); //노드 삭제

void Search_Insert(); //삽입을 위한 검색


int j, i, k;

int b = 1; //노드를 추가하기 위해서 만든 변수

int cnt = 0; //노드가 몇갠지 세준다.


void main()

{

int a = 0;

int d = 0;


while (1) {

printf("현재 노드는 %d 개 입니다.\n", cnt);

puts("");

printf("1. 추가\n");

printf("2. 삽입 \n");

printf("3. 삭제\n");

printf("4. 출력\n");

printf("5. 수정\n");

puts("6. 종료");

puts("");


scanf("%d",&a);


if (a == 2) {

puts("1. 학번");

puts("2. 이름");


scanf("%d",&d);


switch (d)

{

case 1: Search_Insert(); break;

case 2: Search_Insert(); break;

default: puts("잘못눌렀습니다"); break;

}

}


switch (a) {

case 1: Add_node(); system("cls");  break;

case 2: Insert_node(); system("cls"); break;

case 3: Delete_node(); system("cls"); break;

case 4: system("cls"); Print_node(); break;

case 5: Edit(); break;

case 6: exit(1); break;

default: puts("잘못눌렀습니다."); break;

}

}

}


void Add_node()

{

Tag add_node = (Tag)malloc(sizeof(tag));

printf("이름 : ");

scanf("%s", add_node->Name);

printf("번호 : ");

scanf("%s", add_node->Tel);

printf("주소 : ");

scanf("%s", add_node->Addr);

printf("학번 : ");

scanf("%s", add_node->Class);


if (b == 1) {

head = add_node;

tail = head;


b += 2;

}

tail->next = add_node;

tail = add_node;


tail->next= NULL;


cnt += 1;

}


void Search_Insert()

{

if (head == NULL) {

puts("No List");

puts("");

Add_node();

}


p = head;

char name[20];


Print_node();


if (d != 1 && d != 2) {

system("cls");

puts("잘못 누르셨습니다.");

Sleep(1500);

system("cls");

return;

}



if (d == 2) {

puts("입력한 이름의 뒤에 삽입을 합니다. 이름을 검색하세요. : ");

scanf("%s",name);

for (i = 1; i < cnt; i++) {

if (strcmp(name, p->Name)==0) {

break;

Insert_node();

}

else if (strcmp(name, p->Name) != 0) {

p = p->next;

}

}

}

if (d == 1) {

puts("입력한 학번 뒤에 삽입을 합니다. 학번을 검색하세요. : ");

scanf("%s",name);

for (i = 1; i < cnt; i++) {

if (strcmp(name, p->Class) == 0) {

break;

Insert_node();

}

if (strcmp(name, p->Class) != 0) {

p = p->next;

}

}

}

}


void Insert_node()   //정렬 후 삽입

{

if (head == NULL) {

puts("노드가 없습니다. ");

puts("");


Add_node();

}


char name[20];


Tag add_node = (Tag)malloc(sizeof(tag));

printf("이름 : ");

scanf("%s", add_node->Name);

printf("번호 : ");

scanf("%s", add_node->Tel);

printf("주소 : ");

scanf("%s", add_node->Addr);

printf("학번 : ");

scanf("%s", add_node->Class);

if (p->next == NULL) {

p->next = add_node;

tail = add_node;

add_node->next = NULL;


}

else if (p->next != NULL) {

add_node->next = p->next;

p->next = add_node;

}

cnt += 1;

}



void Print_node()

{

if (head == NULL)

puts("노드가 없습니다.");


ptr = head;


while (ptr != NULL) {

puts("");

printf("이름 : %s \n", ptr->Name);

printf("번호 : %s \n", ptr->Tel);

printf("주소 : %s \n", ptr->Addr);

printf("학번 : %s \n", ptr->Class);


puts("");


ptr = ptr->next;

}

}


void Delete_node()

{

p = head, prev = NULL;


int c=0;


puts("1. 이름");

puts("2. 번호");

puts("3. 주소");

puts("4. 학번");


printf("어떤 것으로 삭제할지 입력하세요 : ");

scanf("%d",&c);


if (c != 1 && c != 2 && c != 3 && c != 4) {

system("cls");

puts("잘못 누르셨습니다.");

Sleep(1500);

system("cls");

return;

}


char name[20];

char tel[20];

char addr[30];

char class_[20];



if (c == 1) {

printf("입력한 이름의 주소록을 삭제합니다. 이름을 입력하세요. : ");


scanf("%s", name);


while (p != NULL) {

if ((strcmp(name, p->Name)) == 0) {

if (p == head && p->next == NULL) {

b = 1;

free(p);

break;

}

else if (p == head && p->next != NULL) {

head = p->next;

free(p);

p = head;

break;

}


prev->next = p->next;

free(p);

break;

}

else if (p->next == NULL) {

puts("찾는 노드가 X");

}

prev = p;

p = p->next;

}

cnt -= 1;

}

if (c == 2) {

printf("입력한 번호의 주소록을 삭제합니다. 번호를 입력하세요. : ");


scanf("%s", tel);


while (p != NULL) {

if ((strcmp(tel, p->Tel)) == 0) {

if (p == head && p->next == NULL) {

b = 1;

free(p);

break;

}

else if (p == head && p->next != NULL) {

head = p->next;

free(p);

p = head;

break;

}

prev->next = p->next;

free(p);

break;

}

else if (p->next == NULL) {

puts("찾는 노드가 X");

}

prev = p;

p = p->next;

}

}

if (c == 3) {

printf("입력한 주소의 주소록을 삭제합니다. 주소를 입력하세요. : ");


scanf("%s", addr);


while (p != NULL) {

if ((strcmp(addr, p->Addr)) == 0) {

if (p == head && p->next == NULL) {

b = 1;

free(p);

break;

}

else if (p == head && p->next != NULL) {

head = p->next;

free(p);

p = head;

break;

}

prev->next = p->next;

free(p);

break;

}

else if (p->next == NULL) {

puts("찾는 노드가 X");

}

prev = p;

p = p->next;

}

}

if (c == 4) {

printf("입력한 학번의 주소록을 삭제합니다. 학번을 입력하세요. : ");


scanf("%s",class_);


while (p != NULL) {

if ((strcmp(class_, p->Class)) == 0) {

if (p == head && p->next == NULL) {

b = 1;

free(p);

break;

}

else if (p == head && p->next != NULL) {

head = p->next;

free(p);

p = head;

break;

}

prev->next = p->next;

free(p);

break;

}

else if (p->next == NULL) {

puts("찾는 노드가 X");

}

prev = p;

p = p->next;

}

}

}



void Edit()

{

if (head == NULL) {

puts("노드가 없습니다.");

}


int c=0;


char name[20];

char tel[20];

char addr[30];

char class_[20];


p = head;

system("cls");

puts("1. 이름");

puts("2. 번호");

puts("3. 주소");

puts("4. 학번");


printf("어떤 것으로 수정할지 입력하세요 : ");

scanf("%d", &c);


if (c != 1 && c != 2 && c != 3 && c != 4) {

system("cls");

return;

puts("잘못 누르셨습니다.");

Sleep(1500);

system("cls");

}


system("cls");


Print_node();


if (c == 1) {

puts("수정할 이름을 입력해주세요.");

puts("");

scanf("%s", name);

puts("")


;

if (strcmp(name, p->Name) == 0) {

printf("이름 : ");

scanf("%s", p->Name);

printf("번호 : ");

scanf("%s", p->Tel);

printf("주소 : ");

scanf("%s", p->Addr);

printf("학번 : ");

scanf("%s", p->Class);

puts("");

puts("수정 완료");

}


p = p->next;

}

if (c == 2) {

puts("수정할 번호를 입력해주세요.");

puts("");

scanf("%s",tel);

puts("");


while (p != NULL) {

if (strcmp(tel, p->Tel) == 0) {

printf("이름 : ");

scanf("%s", p->Name);

printf("번호 : ");

scanf("%s", p->Tel);

printf("주소 : ");

scanf("%s", p->Addr);

printf("학번 : ");

scanf("%s", p->Class);

puts("");

puts("수정 완료");

}


p = p->next;

}

}

if (c == 3) {

puts("수정할 주소를 입력해주세요.");

puts("");

scanf("%s", addr);

puts("");


while (p != NULL) {

if (strcmp(addr, p->Addr) == 0) {

printf("이름 : ");

scanf("%s", p->Name);

printf("번호 : ");

scanf("%s", p->Tel);

printf("주소 : ");

scanf("%s", p->Addr);

printf("학번 : ");

scanf("%s", p->Class);

puts("");

puts("수정 완료");

}

p = p->next;

}

}

if (c == 4) {

puts("수정할 학번을 입력해주세요.");

puts("");

scanf("%s", class_);

puts("");


while (p != NULL) {

if (strcmp(class_, p->Class) == 0) {

printf("이름 : ");

scanf("%s", p->Name);

printf("번호 : ");

scanf("%s", p->Tel);

printf("주소 : ");

scanf("%s", p->Addr);

printf("학번 : ");

scanf("%s", p->Class);

puts("");

puts("수정 완료");

}

p = p->next;

}

}


}

반응형