티스토리 뷰
// Singly Linked List
#include <stdio.h>
#include <stdlib.h>
int in;
//node 구조체정의
struct node {
int data;
struct node *next;
};
struct node* head = 0;
//sLL에 추가하는함수
void addToSLL(int data)
{
struct node *cur;
cur = (struct node*)malloc(sizeof(struct node));
cur->data = data;
cur->next = 0;
//1.SLL이 empty
if (head == 0) {
head = cur;
return;
}
//2 else
//2.1끝을찾자
//2.2끝에 붙이자
{
struct node* lastnode = head;
while (lastnode->next != 0)
{
lastnode = lastnode->next;
}
lastnode->next = cur;
return;
}
}
/* SLL에 삽입하는함수
where 을 찾아서 그뒤에 what을 추가
where가 없으면 맨앞에 what을 추가*/
void insertToSLL(int where, int what)
{
//1.where를찾자
struct node *wp = head;
while (1) {
if (wp == 0) {
break;
}
if (wp->data == where) {
break;
}
wp = wp->next;
}
{
struct node *cur;
cur = (struct node *)malloc(sizeof(struct node));
cur->data = what;
cur->next = 0;
if (wp == 0) { // where를 가진 노드가 없으므로 맨앞에 추가
cur->next = head;
head = cur;
return;
}
else { //where를 찾았으므로 뒤에 추가
cur->next = wp->next;
wp->next = cur;
}
}
}
//data를 찾아서 삭제
void delFromSLL(int data)
{
struct node *cur = head;
while (1) { // 찾는다
if (cur == 0) {
break;
}
if (cur->data == data) {
break;
}
cur = cur->next;
}
if (cur == 0) { //지울 것을 못 찾았음
return;
}
{
//1. 맨 앞의 것을 가리키는 경우
if (cur == head) {
head = head->next;
free(cur);
return;
}
else { //2. 아닌경우
struct node *prev = head; //previous
while (prev->next != cur) { // prev 가 cur 를가리켜야하므로 찾는다
prev = prev->next;
}
prev->next = cur->next;
free(cur);
return;
}
}
}
// 위치를 찾아서 삭제
void DelLocation(int n)
{
int i;
struct node* find = head;
if (n == 1) {
delFromSLL(head->data);
return;
}
if (n >= in) return;
for (i = 1; i < n; i++) {
find = find->next;
}
delFromSLL(find->data);
return;
}
//완전삭제
void destroySLL()
{
struct node *cur = head;
while (1) {
if (cur == 0) {
return;
}
head = head->next;
free(cur);
cur = head;
}
}
void destroyReverse()
{
struct node *cur;
while (1) {
cur = head;
if (head->next == 0) { //노드가 하나남게될 경우
free(head);
head = 0;
return;
}
while (cur->next->next != 0) {
cur = cur->next;
}
free(cur->next);
cur->next = 0;
}
}
//SLL에 들어있는 데이터를 앞에서부터 차례로출력
void showSLL()
{
struct node *cur = head;
while (cur != 0) {
printf("%d ", cur->data);
cur = cur->next;
}
return;
}
// showSLL 의 역순
void showSLLReverse()
{
struct node *cur;
while (1) {
cur = head;
if (head->next == 0) { //노드가 하나남게될 경우
printf("%d", head->data);
head = 0;
return;
}
while (cur->next->next != 0) {
cur = cur->next;
}
printf("%d ", cur->next->data);
cur->next = 0;
}
}
int main(void)
{
int i;
int num;
int ins1, ins2;
scanf("%d", &in);
for (i = 0; i < in; i++) {
scanf("%d",&num);
addToSLL(num);
}
scanf("%d", &ins1);
scanf("%d", &ins2);
insertToSLL(ins1, ins2);
showSLL();
return 0;
}
'IT > 자료 구조' 카테고리의 다른 글
[데이터구조] SLL간의 같은 숫자 갯수 세기/ 초간단 정리!! /SLL 응용문제 (0) | 2020.04.01 |
---|---|
[데이터구조] SLL에 숫자 데이터 삽입하기 / 초간단 정리!! (0) | 2020.03.31 |
[데이터 구조] SLL의 데이터를 역순으로 보여주기 (0) | 2020.03.26 |
[데이터 구조] SLL에서 데이터 찾아서 지우고 결과 출력하기(변형) (0) | 2020.03.26 |
[데이터 구조] SLL에서 데이터 찾아서 지우고 결과 출력하기 (0) | 2020.03.26 |
댓글