'2014/01/13'에 해당되는 글 36건

  1. 2014.01.13 [런게임] 유니티 3D로 러너 게임 만들기 - 게임오버
  2. 2014.01.13 [런게임] 유니티 3D로 러너 게임 만들기 - GUI 와 게임시작
  3. 2014.01.13 프로그래머를 위한 책
  4. 2014.01.13 Code Complete
  5. 2014.01.13 게임프로그래머를 위한 자료구조와 알고리즘
  6. 2014.01.13 Introduction to Algorithms
  7. 2014.01.13 [펌][자료구조] 연결리스트 (Linked List) - 개념과 구현
  8. 2014.01.13 길찾기 알고리즘 종류들
  9. 2014.01.13 [펌]C언어 자료구조 - 연결리스트(Linked List)
  10. 2014.01.13 [펌] 단순연결리스트(Single Linked List) 예제

[런게임] 유니티 3D로 러너 게임 만들기 - 게임오버

|

게임 오버

gui manager 스크립트에 game-over event도 더합니다. game start event를 더한것과 마찬가지로 더하시면 됩니다.
	void Start () {
		GameEventManager.GameStart += GameStart;
		GameEventManager.GameOver += GameOver;
		gameOverText.enabled = false;
	}

	private void GameOver () {
		gameOverText.enabled = true;
		instructionsText.enabled = true;
		enabled = true;
	}
게임오버 이벤트는 Runner가 떨어졌을때 발생합니다. 우리는 간단하게Game Over Y 변수를 Runner 에 추가하고 값을  -6으로 설정합니다,그리고 이것을 체크하여 그 밑으로 떨어지면 gameOver 이벤트를 발생하게 합니다.
	public float gameOverY;

	void Update () {
		if(touchingPlatform && Input.GetButtonDown("Jump")){
			rigidbody.AddForce(jumpVelocity, ForceMode.VelocityChange);
			touchingPlatform = false;
		}
		distanceTraveled = transform.localPosition.x;

		if(transform.localPosition.y < gameOverY){
			GameEventManager.TriggerGameOver();
		}
	}
Game over threshold.


Trackback 0 And Comment 0

[런게임] 유니티 3D로 러너 게임 만들기 - GUI 와 게임시작

|

GUI 와 게임 시작

현재 우리는 game start 이벤트를 가지고 있습니다. GUI를 생성하고 매니저 클래스에서 이것을 사용할 것입니다.

 우리의 scene에 텍스트 라벨을 하나 더할것 입니다. 우리가 오브젝트 그룹들을 편리하게 관리하기 위해서, 빈 게임 오브젝트를 만들고 포지션은 (0,0,0)으로 설정하고 이것의 이름을 GUI라고 정합니다. 빈 게임 오브젝트에 guiText 컴포넌트를 생성하고 하위에 추가합니다. (Component / Rendering / GUIText). GUIText의 Anchor 필드값을 middle center로 맞춥니다.

첫번째 오브젝트의 이름은 Game Over Text 이고, Text 필드값에 "GAME OVER"를 입력하고  Font Size는 40, Font Style은 bold로 설정합니다. 위치를 (0.5, 0.2, 0)로 수정하면 화면의 밑에 나타날 것입니다.

두번째 오브젝트의 이름은 Instructions Text이고, 또한 bold로 맞추고 font size는 20, 그리고 text필드에는 "press Jump (x or space) to play"를 설정합니다. 위치는 (0.5, 0.1, 0)로 수정합니다. 

세번째 오브젝트는 Runner Text이고, text "RUNNER"이고, 스타일 bold, 그리고 font size 는 60으로 설정하고. 위치는 (0.5, 0.5, 0)로 설정합니다.

GUIManager 클래스를 생성하고 Managers 폴더에 집어넣고  GUIText 변수들을 만듭니다. 새로운 오브젝트 GUI Manager를 생성하고 스크립트를 컴포넌트에 붙입니다. 그리고 매너저의 하위 에

 붙입니다. 그리고 각 텍스트 오브젝트를 필드에 할당해줍니다.

using UnityEngine;

public class GUIManager : MonoBehaviour {

	public GUIText gameOverText, instructionsText, runnerText;
}
game over instructionstitlemanagergui
GUI Text.
 Start 메서드에서는 gameOverText 를 enabled를 false로 설정하여 보이지 않게 설정하고, Update 메서드에서는 점프 버튼을 누를시 game-start event 상태로 변경되게 됩니다.
	void Start () {
		gameOverText.enabled = false;
	}

	void Update () {
		if(Input.GetButtonDown("Jump")){
			GameEventManager.TriggerGameStart();
		}
	}
Now it's time to include a method to handle our game-start event, let's appropriately name itGameStart. 우리는 이 메서드를 사용해서 text를 없어지게 할것이다. Update 메서드에서도 더이상 호출이 되지 않습니다.
	private void GameStart () {
		gameOverText.enabled = false;
		instructionsText.enabled = false;
		runnerText.enabled = false;
		enabled = false;
	}
마지막 단계에서는 GameStart 메서드를 우리의 매니저 클래스에 더해줍니다.
	void Start () {
		GameEventManager.GameStart += GameStart;
		gameOverText.enabled = false;
	}





Trackback 0 And Comment 0

프로그래머를 위한 책

|

Code Complete - Steve McConnell

The Art of Computer Programming - Knuth

Structure and Interpretation of Computer Programs - Hal Abelson's, Jerry Sussman's and Julie Sussman's

The Pragmatic Programmer


Programming Pearls by Jon Bentley (생각하는 프로그래밍)
The Mythical Man-Month by Frederick Brook (맨먼스 미신)

kkb110의 아바타

Game programming gems......

Game programming gems...... 전 이 씨리즈가 재밌고 볼만하던데요.

게임 프로그래밍에서 실제 필요한 유용한 테크닉들을 프로그래밍/수학/알고리즘/인공지능/ 등 5개 색션으로 나누어
글 묶음 형식으로 만들어 둔 책입니다.

꼭 게임 프로그래밍을 하지 않더라도 충분히 재밌고 유용하다고 생각합니다.

code complete
effective c++
more effective c++
effective STL

등도 읽어봤는데

저책들도 좋지만 다시읽어보고 싶은 책을 고르라면 주저없이 GPG를 찍겠습니다.

gpgstudy.com이란 이책을 주제로 모인 사이트도 있고

http://www.gpgstudy.com/gpgiki/GpgPreview?style=simple 여기에서 몇몇글들을 미리 맛볼 수 있습니다.

Quote:
GPG 3 미리보기

* 1부 프로그래밍 일반 - 1.2 객체 조합식 게임 프레임웍 (Scott Patterson, Next Generation Entertainment )
* 2부 수학 - 2.4 사원수의 압축 (Mark Zarb-Adami, Muckyfoot Productions)
* 3부 인공지능 - 3.5 AI 에이전트, 객체, 퀘스트를 위한 확장성있는 트리거 시스템 (Steve Rabin, Nintendo of America, Inc.)
* 4부 그래픽 프로그래밍 - 4.13 법선 맵을 이용한 곡면 흉내내기 (Oscar Blasco, Aside Software )
* 5부 네트웍 및 멀티플레이어 - 5.6 보안 소켓 (Pete Isensee, Microsoft Corporation)
* 6부 오디오 - 6.1 Ogg Vorbis를 이용한 오디오 압축 (Jack Moffitt, Xiph.org Foundation)

GPG 2 미리보기

* 1부 프로그래밍 일반 - 1.12 윈도우즈 기반 게임을 위한 선형적 프로그래밍 모델 (Javier F. Otaegui, Sabarasa Entertainment)
* 2부 수학 - 2.1 부동소수점 비법들: IEEE 부동소수점을 통한 성능 향상 (Yossarian King, Electronic Arts Canada )
* 3부 인공지능 - 3.1 AI 최적화 전략들 (Steve Rabin, Nintendo of America)
* 4부 기하 관리 - 4.2 맞물린 타일들을 이용한 단순화된 지형 시스템 (Greg Snook)
* 5부 그래픽 디스플레이 - 5.1 카툰 렌더링: 실시간 외곽선 변 검출 및 렌더링 (Carl S. Marshall, Intel Architecture Labs)
* 6부 오디오 프로그래밍 - 6.1 게임 오디오 설계 패턴 (Scott Patterson)


1로 갈수록 원론적이고 그 뒤 씨리즈일수록 자잘한 이야기가 나오는데

1->2->3->.. 등등등 순서로 보는 것을 추천합니다..

ldgood의 아바타

어떤 분야를 다루는 프로그래머냐에 따라

추천도서의 의미는 다르겠네요.
웹 프로그래머가 크누쓰 책이나 마법사 책을 꼭 읽어야한다고 생각하지는 않습니다만...

분야에 관계없이 추천하고 싶은 책은
pragmatic programmer시리즈 전체와 위에서 말씀하신 고전(맨먼스미신, 소프트웨어 개발의 지혜, 프로그래밍 심리학, Rapid Software Development, 죽음의 행진 등등)이 완전 강추죠.

최근 오픈소스 관련해서 재미있었던 책은 드리밍인 코드 였습니다

------------------------------
모든것은 모든것에 잇닿아 있다.

------------------------------
모든것은 모든것에 잇닿아 있다.


Trackback 0 And Comment 0

Code Complete

|

Code Complete

Trackback 0 And Comment 0

게임프로그래머를 위한 자료구조와 알고리즘

|

게임프로그래머를 위한 자료구조와 알고리즘

Trackback 0 And Comment 0

Introduction to Algorithms

|

Introduction to Algorithms 일단 적어놓자

알고리즘책 입문서로 많이 추천

Trackback 0 And Comment 0

[펌][자료구조] 연결리스트 (Linked List) - 개념과 구현

|

출처 :  http://blog.naver.com/PostView.nhn?blogId=keloc&logNo=40154090761


지난 시간에는 스택과 의 개념과 배열로 각각 구현을 해봤습니다. 이번에 살펴 볼 연결리스트(Linked List)는 정적인 배열과 달리 동적인 자료구조로 필요한 경우 할당하여 사용하고 필요가 없어지면 해제하는 식으로 메모리 관리가 가능하기 때문에 메모리를 절약할 수 있다는 장점이 있습니다.

 

   

[연결리스트의 기본구조 : 단순 연결리스트]

 

연결리스트(링크드리스트 : Linked List)의 개념

  연결리스트는 노드(Node)와 링크(Link)로 구성되며, 노드는 실제 정보를 담고 있는 하나의 단위이고, 링크는 노드간의 위치정보를 저장하고 있어 연결리스트의 순서를 유지할 수 있도록 하는 연결고리로 이해 하시면 됩니다.

  연결리스트는 각 노드별 링크의 개수와 연결 상태에 따라 다양한 형태로 구성 될 수 있는데요. 단순 연결리스트, 환형 연결리스트, 이중 연결리스트, 이중 환형 연결리스트 등으로 나눌 수 있습니다.

 

단순 연결리스트 (Simple Linked List)

  단순 연결리스트는 위 그림과 같이 선형적으로 한방향인 리스트의 형태로서 가장 많이 쓰이는 형태입니다. 여기서 리스트의 시작과 끝을 가리키는 노드가 필요한데요, 각각 머리(Head)와 꼬리(Tail)이라는 이름의 노드로 항상 존재하게 됩니다.

  앞서 본 선형 구조의 자료구조인 스택과 큐에서처럼 연결리스트에도 노드의 추가, 삭제, 탐색 등의 연산이 있습니다. 여기서는 각각을 insert, delete, find라고 부르겠습니다.

 

  0. 노드 정의

     연결리스트의 노드는 단순히 정수형 데이터 하나만 가진다고 가정하고, 다음과 같이 정의 할 수 있습니다.

typedef struct _node{ 

    int key;

    struct _node *next;

}node; 

      초보자들은 구조체 정의에 _node의 포인터에 당황하실지도 모르겠습니다만, 구조체에서 이런 재귀 정의는 가능하며, 이 의미는 _node라는 구조체 타입을 가리키는 포인터 즉, 다음 노드를 가리킨다는 사실을 아셔야 합니다.

 

  1. 연결리스트 초기화

     연결리스트의 초기상태는 머리(이하 Head)와 꼬리(이하 Tail)가 연결된 형태로 다음과 같은 모양을 가지고 있습니다.

 

[빈 연결리스트]

 

     위와 같이 연결리스트가 비어 있을 경우는 Head가 Tail을 Tail은 그 자신을 가리키는 형태가 되어 있어야 합니다.

node *head, *tail; 

void init_list (void) {

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

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

    head->next = tail;

    tail->next = tail;

  2. 연결리스트의 노드추가 - 삽입 : insert_next

    연결리스트의 삽입(이하 insert)은 다음과 같은 순서로 진행됩니다.

    

    (가) 초기 모양 (t는 head를 가리킴)

 

    

    (나) L node를 생성합니다. (s가 가리킴)

 

    

    (다) L node가 t의 다음 node를 가리킵니다. (s->next = t->next)

 

    

    (라) t의 다음 node 를 L node로 로 변경합니다. (t->next=s)

 

  위와 같은 과정을 구현하면 다음과 같습니다.

node *insert_next (int key, node *t) {

    node *s;

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

    s->key = key;

    s->next = t->next;

    t->next = s;

    return s;

  3. 연결리스트의 노드삭제 - delete_next

    연결리스트의 삭제(이하 delete)는 다음과 같은 순서로 진행됩니다.

    

    (가) 초기상태 (삭제 전 Node를 t가 가리킴)

 

    

    (나) 삭제 대상 Node에 임시 포인터 (s= t->next)

 

    

    (다) 삭제 전 Node의 다음 포인터 (t->next = t->next->next)

 

    

    (라) 삭제 대상 노드 해제 (free(s))

 

    코드로 구현하면,,,

   

int delete_next (node *t) { 

    node *s;

    if (t->next == tail)

        return 0;

 

    s = t->next;                    // (나)

    t->next = t->next->next;  // (다)

    free(s);                         // (라)

    return 1;

  4. 연결리스트 Node 검색 : find

   위와 같이 특정한 key의 다음 Node에 연산을 위해서는 Node를 찾는 연산이 필요한데요. 이는 Head에서 Tail까지 주어진 key가 맞는지 확인 후 return해 주면 됩니다. 바로 코드를 볼께요.

 

node *find_node (int key) { 

    node *s;

    s = head->next;        // head->next가 연결리스트의 첫 node

    while (s->key != key && s != tail)  // 찾는 key가 맞거나 tail이면 끝

        s = s->next;         // 다음 node로

    return s;

    find_node함수의 return값을 보고 tail이면 검색에 실패, 아니면 성공입니다. 쉽죠?

 

  연결리스트의 개념을 이해할 때, Node를 그려가면서 연산(insert, delete)을 직접 손으로 해보는게 좋습니다. 주의할 점은 링크의 연결과 제거 그리고 Node의 메모리 해제의 순서가 달라지면 링크가 끊어져 버리는 오류가 발생할 수 있습니다.

  예를 들어 다음과 같은 경우를 보죠.

 

   (가) insert 하려는 s node를 다음 node에 먼저 연결하지 않은 경우 

       

 

    (나) 삭제하려는 Node s의 메모리를 먼저 해제한 경우

      

 

   이와 같은 실수를 하지 않도록 주의 하시길 바라면서 연결리스트(단순연결리스트)에 대한 설명을 마치겠습니다.

   다음시간에는 환형연결리스트와 이중연결리스트에 대해서 알아보겠습니다.


Trackback 0 And Comment 0

길찾기 알고리즘 종류들

|

Dijkstra's algorithm

Moore's algorithm


Trackback 0 And Comment 0

[펌]C언어 자료구조 - 연결리스트(Linked List)

|

오늘은 C언어 연결리스트에 대해서 포스팅을 해보려고 한다.

내가 자료구조라는 것을 처음 접한 대학교 2학년 때 난 이 연결리스트라는 놈을 도저히 이해할 수가 없었다.
왜 이놈들은 함수가 끝나도 계속 메모리에 남아있는 걸까? 라는게 가장 큰 의문점이었고
두번째는 그냥 적당한 라이브러리 쓰면 되는데 왜 굳이 이런걸 만들어야 하는걸까?
라는게 두번째 의문점이었다.

첫번째 의문점은 후에 "다시 체계적으로 배우는 C언어 포인터" 라는 책을 정독한 후에 풀렸고
두번째 의문점은.. 아직도 미스테리다.
다만 우리가 전산학과 학생으로서 이런 것들을 구현해보고 원리를 파악할 수 있다는 이유로 대충 이해하고 넘어가자.



사족이 길었는데..
연결리스트란 무엇인가?
리스트는 자료를 순차적으로 정리해놓은 것을 말한다.
이것들이 메모리상에서 연결되어 있다는 뜻이다.


배열 리스트 같은 경우 리스트의 크기를 미리 크게 정해놓고 그 범위 안에서만 자료의 관리가 가능하기 때문에 
메모리 낭비가 심하다고 볼수 있는데 
연결리스트의 경우는 자료가 입력 될 때마다 동적할당으로 새로운 메모리 주소에 값을 할당하고 
이전 자료와 연결해주기 때문에 메모리 관리가 용이하다.



자료 하나를 담고있는 녀석을 보통 "노드(node)" 라고 부른다.
연결 리스트에 아무것도 없는 상태에서 100이라는 값을 가진 노드를 추가한다고 생각해보자.

노드는 자기 자신의 값과 다음 노드를 가리키는 노드 포인터로 구성된다.
여기서 첫번째 노드는 100이라는 값을 갖고 있으며 다음 노드는 없으므로 NULL 포인터를 가리킨다.
위에 Head라는 노드포인터도 있는데 이것은 연결리스트라는 자료구조에서 일종의 시작점을 알려준다.
배열 리스트 처럼 인덱스를 이용한 간편한 접근이 불가능하므로 첫 노드를 Head 포인터로 가르켜주고
그 Head 포인터를 이용해 다음 노드, 다음 노드 이런 식으로 다른 노드에 접근할 수 있다.






101이라는 값을 갖고 있는 두번째 노드를 삽입하면 이렇게 된다. (과정은 잠시 후에 설명)
기존에 NULL 포인터를 가리키고 있던 첫번째 노드(100이라는 값을 가진 노드)는 이제 다음 노드로 새로 추가된 노드를 가리키고 두번째이자 마지막 노드가 된 101이라는 값을 가진 노드는 다음 노드로 NULL 포인터를 가리킨다.
연결 리스트는 이와 같은 구조로 자료들을 쭈욱 연결해서 저장한다.






그럼 이제 100 노드와 101 노드 사이에 200이라는 값을 가진 노드를 삽입해보자.
우선 동적할당으로 노드 하나를 만들어주고 200이라는 값을 넣어준다.
이 노드의 다음 노드는 원래 100 노드가 다음 노드로 가리키던 노드를 가리키도록 해준 다음
100노드의 다음 노드를 200 노드로 설정하면 깔끔하게 삽입된다.



나도 공대생 인지라.. 이런 복잡한 그림보다 코드를 보는게 이해가 빠를것 같아서..
설명은 여기까지.





아래는 struct 와 함수 선언부분이다. (헤더파일로 쓸 수 있음)


node 는 정수형인 value 와 node*(노드포인터) 형인 next 라는 변수를 갖고 있다.
이 코드에서 우리는 node 보다는 node pointer를 많이 쓸것이므로 typedef를 이용해 nptr을 지정해줬다.
그다음은 list라는 struct를 정해서 head를 가리키는 노드포인터와 리스트에에 몇개의 노드가 있는지 알려주는 count라는 변수를 만들었다.
그 아래쪽 함수는 생각하는 그대로다. (순서대로 초기화, 삽입, 삭제, 검색, 수정, 출력)




연결 리스트 초기화 함수이다.


메인 함수에서 list를 만들고 그 주소를 init()에 넘겨주어 count와 head를 초기화시킨다.




노드 삽입 함수. 리스트형 포인터 변수와 값, 위치를 인수로 받는다.


처음 if 문은 position 값이 적절한지 체크하는 부분이다. 부적절하면 메시지를 출력하고 종료한다.
다음은 new_nptr 이라는 노드포인터에 node 사이즈만큼의 메모리를 동적할당하고 value변수를 설정해준다.
position이 1인 경우 head포인터가 바뀌어야 하므로 첫부분에서 따로 처리해줬고
그게 아닌 경우는 head 포인터의 값을 tmp라는 변수에 복사해서 for 문을 이용해 의도한 위치에 도달할 때까지 계속 next로 찾아간다.
적정 위치에 도달하면 삽입한 후 리스트의 카운터를 1 증가시킨다.




삭제 함수. 리스트형 포인터변수와 위치를 인수로 받는다.



첫부분은 삽입과 마찬가지로 position의 처리 가능 범위를 체크한다. (단, 삽입의 경우 맨 뒤에도 삽입 가능하기 때문에 기존에 존재하는 노드들의 position만 받아야 하는 삭제 함수와는 범위가 1 차이 난다.)
삽입과 마찬가지로 head 포인터를 tmp로 받아준 다음 position이 1이면 head 노드를 바꿔주고 그게 아니라면 position 변수를 이용해 그 위치로 찾아가서 해당 노드의 연결을 해지시킨다.
삭제될 노드의 앞 노드를 tmp로 받고 그 다음 노드를 tmp2로 받아서 tmp2의 다음노드가 tmp의 다음 노드가 되도록 짰다.
삭제에서 주의할 점은 삭제된 노드가 메모리에서 지워질 수 있도록 free() 함수를 이용해줘야 한다는 것이다.
(이때문에 굳이 tmp2라는 노드 포인터 변수를 선언했다.)




검색 함수. 리스트형 포인터 변수와 값을 인수로 받는다.


값을 입력받아서 리스트를 순회하여 같은 값이 있는지 알아본다.
같은 값이 여러개 있다면 처음 나온 position을 리턴하고 없으면 0을 리턴한다.
테스트를 위해 적절한 printf() 함수를 사용했다.




수정 함수. 리스트형 포인터 변수와 값, 위치를 인수로 받는다.



삽입, 삭제와 비슷한데 다른 점은 head 포인터를 변경할 필요가 없다는 것이다.
해당 위치의 노드만 찾아서 값을 바꿔주면 된다.




출력 함수. 리스트형 포인터 변수를 인수로 받는다.



이건 테스트를 위해 만들어본 함수다.
리스트에 들어있는 값들과 count 값을 출력해준다.




메인 함수.



리스트형 포인터변수에 리스트 크기의 메모리를 동적할당 해주고 init(() 함수를 이용해 초기화시켜준다.
저 뒤에 여러가지 테스트 한다고 끄적거려 논거 있는데 너무 길어서 여기까지만 캡쳐.
그래서 뒤에 } 로 닫아줘야 함.



출처 : http://milvus.tistory.com/17




소스코드


/*

 * linkedlist.c

 *

 *  Created on: 2011. 4. 21.

 *      Author: Chwang

 */


#include <stdio.h>

#include <stdlib.h>


typedef struct _node{

int value;

struct _node* next;

}node;


typedef node* nptr;


typedef struct _list{

int count;

nptr head;

}list;


void init(list* lptr);

void insert(list* lptr,int value,int position);

void delete(list* lptr,int position);

int search(list* lptr,int value);

void modify(list* lptr,int value,int position);

void print_list(list* lptr);



void init(list* lptr){

//initialize the list

lptr->count=0;

lptr->head=NULL;

}


void insert(list* lptr,int value,int position){

//insert value to proper position

if(position<1 || position>(lptr->count)+1){

printf("Position Out of Bound\n");

return;

}

nptr new_nptr=(node*)malloc(sizeof(node));

new_nptr->value=value;


if(position==1){

new_nptr->next=lptr->head;

lptr->head=new_nptr;

}

else{

nptr tmp=lptr->head;

int i;

for(i=1;i<position-1;i++){

tmp=tmp->next;

}

new_nptr->next=tmp->next;

tmp->next=new_nptr;

}

lptr->count++;

}


void delete(list* lptr,int position){

//delete an item on the position

if(position<1 || position>(lptr->count)){

printf("Position Out of Bound\n");

return;

}

nptr tmp=lptr->head;


if(position==1){

lptr->head=tmp->next;

free(tmp);

}

else{

int i;

for(i=1;i<position-1;i++){

tmp=tmp->next;

}

nptr tmp2=tmp->next;

tmp->next=tmp2->next;

free(tmp2);

}

lptr->count--;

}


int search(list* lptr,int value){

//traverse the list and

//find the first position of the value (first from head)

//if not exist, return 0

nptr tmp=lptr->head;

int i=1;

while(tmp!=NULL){

if(value==tmp->value) break;

i++;

tmp=tmp->next;

}

if(i>lptr->count){

printf("The value %d is NOT exists\n",value);

return 0;

}

else{

printf("The value %d is at position %d in the list\n",value,i);

return i;

}

}


void modify(list* lptr,int value,int position){

if(position<1 || position>(lptr->count)){

printf("Position Out of Bound\n");

return;

}

nptr tmp=lptr->head;


int i;

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

tmp=tmp->next;

}

tmp->value=value;

}


void print_list(list* lptr){

nptr tmp=lptr->head;

printf("List value: ");

while(tmp!=NULL){

printf("%d ",tmp->value);

tmp=tmp->next;

}

printf("\n");

printf("Total: %d value(s)\n",lptr->count);

}


int main(){

list* mylist=(list*)malloc(sizeof(list));

init(mylist);


insert(mylist,3,1);

insert(mylist,4,2);

insert(mylist,5,3);

insert(mylist,6,4);

insert(mylist,7,5);

insert(mylist,8,6);

insert(mylist,9,7);

insert(mylist,3,3);


print_list(mylist);


delete(mylist,3);

delete(mylist,5);


print_list(mylist);


search(mylist,6);

search(mylist,9);

search(mylist,0);


modify(mylist,100,1);

modify(mylist,101,2);


print_list(mylist);


return 0;

}



Trackback 0 And Comment 0

[펌] 단순연결리스트(Single Linked List) 예제

|

#include <stdio.h>

#include <malloc.h>

#include <stdlib.h>

#include <time.h>

 

typedef struct tagNode

{

       int data;

       struct tagNode *next;

} NODE;

 

NODE *head, *tail, *working;

 

// 리스트초기화

void InitList();

// 데이타하나추가

void Insert(int n);

// 주어진데이타를삭제

void Delete(int n);

// 데이타를모두삭제

void RemoveAll();

// 현재리스트의값들을모두더해서보여준다.

void AddAll();

// 주어진데이타와같은노드개수를카운트

int Count(int n);

// 현재리스트의모든내용을보여준다.

void DisplayList();

 

int main()

{

       // 리스트초기화

       InitList();

 

       Insert(10);

       Insert(20);

       Insert(30);

       Insert(40);

       Insert(50);

       Insert(10);

      

       // Display 함수를이용하여연결리스트의데이터들을출력한다.

       DisplayList();

 

       // 전체합출력

       AddAll();

 

       // 데이타값이10 인노드의개수를카운트

       Count(10);

 

       // 노드삭제

       Delete(10);

       DisplayList();

       Delete(50);

       DisplayList();

       Delete(20);

       DisplayList();

 

       RemoveAll();

 

       return 0;

}

 

void InitList()

{

       // 리스트초기화

       head = NULL;

       tail = NULL;

       working = NULL;

}

 

void Insert(int n)

{

       // 새로노드를하나만들어서값을대입

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

       printf("Adding %d\n", n);

       working->data = n;

 

       // 이것이꼬리임

       working->next = NULL;

 

       // 만약머리가비었으면이것이머리임

       if ( head == NULL )

       {

             head = working;

             tail = working;

             return;

       }

 

       // 머리가아니라면마지막에노드를삽입하고

       tail->next = working;

       // 이것이꼬리임

       tail = working;

}

 

void Delete(int n)

{

       // 아무런데이타도없으면

       if ( head == NULL )

             // 지울일도없다.

             return;

 

       // 일단머리를가져온다.

       working = head;

       NODE* node;

 

       // 같은값을찾아서삭제

       while ( working )

       {

             if ( working->data == n )

             {

                    printf("Deleting %d...\n", working->data);

                    if ( working == head )

                    {

                           head = working->next;

                           delete working;

                    }

                    else

                    {

                           node->next = working->next;

                           delete working;

                    }

                    Delete(n);   // 다른값이있으면또지움

                    break;

             }

             node = working;

             working = working->next;

       }

}

 

void RemoveAll()

{

       // 머리를가져와서

       working = head;

 

       // 끝까지지움

       while ( working )

       {

             NODE *node = working;

             // 다음노드준비

             working = working->next;

             // 노드삭제

             printf("Deleting %d\n", node->data);

             free(node);

             node = NULL;

       }

 

       InitList();

       printf("All elements deleted.\n");

}

 

void AddAll()

{

       int sum = 0;

 

       working = head;

 

       while ( working )

       {

             sum += working->data;

             working = working->next;

       }

 

       printf("Sum of all : %d\n", sum);

}

 

int Count(int n)

{

       int count = 0;

 

       working = head;

 

       while ( working )

       {

             if ( working->data == n )

                    ++count;

             working = working->next;

       }

 

       printf("Count of %d : %d\n", n, count);

 

       return count;

}

 

void DisplayList()

{

       printf("Display all element : ");

 

       printf("head = ");

       working = head;

 

       while ( working )

       {

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

             working = working->next;

       }

       printf("= tail\n");

}출처 : http://blog.naver.com/PostView.nhn?blogId=xtelite&logNo=50086163288&redirect=Dlog&widgetTypeCall=true

[출처] 

ㅊㅊㅊㅊㅊ출처:

(Single Linked List) 예제|작성자 xtElite


Trackback 0 And Comment 0
prev | 1 | 2 | 3 | 4 | next