C언어 연결리스트를 활용

Posted by Hide­
2015.07.22 15:21 Coding/C

#include <stdio.h>

#include <stdlib.h>

typedef struct Node {

int data;

struct Node *link;

}NODE;


void print_all();

void insert_node(int n);

void delete_node(int n);

NODE *head = NULL;


main()

{

insert_node(4);

insert_node(3);

insert_node(1);

insert_node(5);

insert_node(2);

print_all();

puts("2삭제");

delete_node(2);

print_all();

}


void print_all() {

NODE *p = head;

while(p != NULL) {

printf("%d -> ", p->data);

p = p->link;

}

printf("NULL\n");

}


void insert_node(int n) {

NODE *p = head;

NODE *node = (NODE*)malloc(sizeof(NODE));

node->data = n;

node->link = NULL;


if(head == NULL)

head = node;

else if(p->data > node->data) {

node->link = p;

head = node;

}

else {

while(p->link != NULL && p->link->data < node->data)

p = p->link;

node->link = p->link;

p->link = node;

}

}


void delete_node(int n) {

NODE *p = head;

NODE *temp = NULL;


if(head == NULL) {

puts("빈 리스트입니다.");

return;

}

else if(p->data == n) {

temp = p;

head = p->link;

free(temp);

return;

}

else {

while(p->link != NULL) {

if(p->link->data == n) {

temp = p->link;

p->link = p->link->link;

free(temp);

return;

}

p = p->link;

}

}

}




/*단일연결리스트*/

#include <stdio.h>

#include <stdlib.h>

typedef struct Node {

int data;

struct Node *link;

}NODE;


void insert_node(NODE **head, int n); // 삽입함수

void search_node(NODE *head, int n); // 검색함수

void print_node(NODE *head); // 출력함수

void delete_node(int n); // 삭제함수

int flag = 0, locate = 0; // 검색 시 해당 숫자 존재유무 및 위치저장변수


NODE* head = NULL;


main()

{

insert_node(&head, 4);

insert_node(&head, 2);

insert_node(&head, 3);

insert_node(&head, 1);

insert_node(&head, 5);

print_node(head);

search_node(head, 2);

if (flag == 1){

delete_node(2);

puts("삭제 후 출력 ");

print_node(head);

}

else

puts("존재하지 않는 숫자입니다.");

}


void print_node(NODE *head)

{

NODE *p = head;

while (p != NULL){

printf("%d -> ", p->data);

p = p->link;

}

printf("NULL\n");

}


void search_node(NODE *head, int n)

{

flag = 0;

locate = 0;

NODE *p = head;

while (p != NULL){

locate++;

if (p->data == n){

flag = 1;

break;

}

else

p = p->link;

}

}


void insert_node(NODE **head, int n) // 삽입 시 오름차순으로 정렬하여 삽입하는 함수

{

NODE *p = *head;

NODE *node = (NODE*)malloc(sizeof(NODE));

node->data = n;

node->link = NULL;

if (*head == NULL) // 헤드가 비었을때, 즉 빈리스트 일때

{

*head = node;

}

else if (p->data > node->data) // 빈리스트는 아니지만 헤드의 앞에 삽입하고 싶을때

{

node->link = p;

*head = node;

}

else // 빈리스트도 아니고 헤드의 앞에 삽입도 아닐 때

{

while (p->link != NULL && p->link->data < node->data)

p = p->link;

node->link = p->link;

p->link = node;

}

}


/*

void insert_node(NODE **head, int n) // 정렬하지않고 삽입

{

NODE *p = *head;

NODE *node = (NODE*)malloc(sizeof(NODE));

node->data = n;

node->link = NULL;


if (*head == NULL)

*head = node;

else{

while (p->link != NULL)

p = p->link;

node->link = p->link;

p->link = node;

}

}

*/


void delete_node(int n) // 삭제함수

{

NODE *temp = (NODE*)malloc(sizeof(NODE));

NODE *p = head;

if (head == NULL) // head가 비어있을경우

{

puts("빈 리스트입니다.");

return;

}


if (head->data == n)//삭제할 위치가 맨앞이라면

{

temp = head;//삭제할 위치 저장

head = head->link;//맨앞위치를 다음으로 변경

free(temp);//메모리 삭제

return;

}

while (p->link != NULL)

{ // NULL 이 아닐때까지

if (p->link->data == n)

{

temp = p->link; // 삭제할 위치 저장

p->link = p->link->link; // 삭제할 위치를 건너뛰어 연결

free(temp); // 메모리 삭제

return;

}

p = p->link; // 다음 노드로 이동

}

}




사용자에게 입력

#include <stdio.h>

#include <stdlib.h>

typedef struct Node{

int data;

struct Node *link;

}NODE;


void print_all(NODE *head);

void insert_node(NODE **head, int n);

void delete_node(int n);

NODE *head = NULL;


main()

{

int num = 0;

while(1){

printf("\n");

puts("--------------");

puts("1. 데이터 삽입");

puts("2. 데이터 삭제");

puts("3. 데이터 출력");

puts("--------------");

fputs("Enter : ", stdout);

scanf("%d", &num);

switch(num){

case 1:

fputs("Input Data : ", stdout);

scanf("%d", &num);

insert_node(&head, num);

break;

case 2:

fputs("Delete Data : ", stdout);

scanf("%d", &num);

delete_node(num);

break;

case 3:

print_all(head);

break;

default:

puts("잘못된 명령입니다.");

break;

}

}

}


void print_all(NODE *head)

{

NODE *p = head;

while(p != NULL){

printf("%d -> ", p->data);

p = p->link;

}

printf("NULL\n");

}


void insert_node(NODE **head, int n)

{

NODE *p = *head;

NODE *node = (NODE*)malloc(sizeof(NODE));

node->data = n;

node->link = NULL;


if(*head == NULL)

*head = node;

else if(p->data > node->data){

node->link = p;

*head = node;

}

else{

while(p->link != NULL && p->link->data < node->data)

p = p->link;

node->link = p->link;

p->link = node;

}

}


void delete_node(int n)

{

NODE *p = head;

NODE *temp = (NODE*)malloc(sizeof(NODE));


if(head == NULL){

puts("빈 리스트입니다.");

return;

}

if(head->data == n){

temp = head;

head = head->link;

free(temp);

return;

}

while(p->link != NULL){

if(p->link->data == n){

temp = p->link;

p->link = p->link->link;

free(temp);

return;

}

p = p->link;

}

}



/*이중연결리스트*/
#include <stdio.h>
#include <stdlib.h>
typedef struct Node{
int data;
struct Node *prev;
struct Node *next;
}NODE;

void print_all(NODE *head);
void insert_node(NODE **head, int n);
void delete_node(int n);
NODE *head = NULL;

main()
{
insert_node(&head, 4);
insert_node(&head, 5);
insert_node(&head, 1);
insert_node(&head, 3);
insert_node(&head, 2);
print_all(head);
delete_node(1);
puts("1 삭제 후");
print_all(head);
}

void print_all(NODE *head)
{
NODE *p = head;
while(p != NULL){
printf("%d -> ", p->data);
p = p->next;
}
printf("NULL\n");
}

void insert_node(NODE **head, int n)
{
NODE *p = *head;
NODE *node = (NODE*)malloc(sizeof(NODE));
node->data = n;
node->prev = NULL;
node->next = NULL;

if(*head == NULL){
*head = node;
node->prev = *head;
}
else if(p->data > node->data){
node->next = p;
node->prev = *head;
*head = node;
}
else {
while(p->next != NULL && p->next->data < node->data)
p = p->next;
node->next = p->next;
node->prev = p;
p->next = node;
}
}

void delete_node(int n)
{
NODE *p = head;
NODE *temp = NULL;
if(head == NULL){
puts("빈 리스트입니다.");
return;
}
if(head->data == n){
temp = head;
head = head->next;
head->next->prev = head;
free(head);
return;
}
while(p->next != NULL){
if(p->next->data == n){
temp = p->next;
p->next->prev = p;
p->next = p->next->next;
free(temp);
return;
}
p = p->next;
}
}


/*연결리스트를 이용한 스택*/

#include <stdio.h>

#include <stdlib.h>

typedef struct Node{

int data;

struct Node *link;

}NODE;


void print_all(NODE *top);

void push(NODE **top, int n);

void pop();

NODE *top = NULL;


main()

{

push(&top, 1);

push(&top, 3);

push(&top, 4);

push(&top, 2);

push(&top, 5);

print_all(top);

printf("\nPOP 후\n\n");

pop();

print_all(top);

}


void print_all(NODE *top)

{

NODE *p = top;

printf("[Top] ");

while (p != NULL){

printf("%d -> ", p->data);

p = p->link;

}

printf("[Bottom]\n");

}


void push(NODE **top, int n)

{

NODE *p = *top;

NODE *node = (NODE*)malloc(sizeof(NODE));

node->data = n;

node->link = NULL;


if (*top == NULL){

*top = node;

}

else {

node->link = *top;

*top = node;

}

}


void pop()

{

if (top == NULL){

puts("스택이 비었습니다.");

return;

}

NODE *temp = NULL;

temp = top;

top = top->link;

free(temp);

}



/*연결리스트 스택2*/

#include <stdio.h>

#include <stdlib.h>

typedef struct Node {

int data;

struct Node *link;

}NODE;


void print_all();

void pop();

void push(int n);


NODE *top = NULL;


main()

{

push(4);

push(2);

push(1);

push(5);

push(3);

print_all();

pop();

pop();

print_all();

}


void print_all()

{

NODE *p = top;

printf("[Top] ");

while (p != NULL) {

printf("%d -> ", p->data);

p = p->link;

}

printf("[Bottom]\n");

}


void push(int n)

{

NODE *p = top;

NODE *node = (NODE*)malloc(sizeof(NODE));

node->data = n;

node->link = NULL;

if (top == NULL) {

top = node;

}

else {

node->link = top;

top = node;

}

}


void pop()

{

NODE *p = top;

NODE *temp = NULL;


if (top == NULL) {

puts("빈 스택입니다.");

return;

}

else {

temp = top;

top = top->link;

free(temp);

return;

}

}



/*연결리스트 큐*/

#include <stdio.h>

#include <stdlib.h>

typedef struct Node {

int data;

struct Node *link;

}NODE;


void print_all();

void dequeue();

void enqueue(int n);


NODE *front = NULL;

NODE *rear = NULL;


main()

{

enqueue(1);

enqueue(2);

enqueue(3);

print_all();

dequeue();

print_all();

dequeue();

print_all();

}


void print_all()

{

NODE *p = front;

printf("[Front] ");

while (p != NULL) {

printf("%d -> ", p->data);

p = p->link;

}

printf("[Rear]\n");

}


void enqueue(int n)

{

NODE *p = rear;

NODE *node = (NODE*)malloc(sizeof(NODE));

node->data = n;

node->link = NULL;


if (rear == NULL) {

front = node;

rear = node;

}

else {

rear->link = node;

rear = node;

}

}


void dequeue()

{

NODE *p = front;

NODE *temp = NULL;


if (front == NULL) {

puts("빈 큐입니다.");

return;

}

else {

temp = front;

front = front->link;

}

}




다른 사람들이 많이 읽은 글

'Coding > C' 카테고리의 다른 글

소켓 프로그래밍  (0) 2016.02.18
AF_INET / PF_INET 차이점  (2) 2016.02.16
C언어 연결리스트를 활용  (0) 2015.07.22
이 댓글을 비밀 댓글로

티스토리 툴바