Notice
Recent Posts
Recent Comments
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 보안뉴스 요약
- 자바스크립트 jQuery
- GIT
- 보안뉴스 한줄요약
- 카카오프로젝트 100
- javascript
- python
- oracle db
- 카카오프로젝트100
- 카카오프로젝트
- 자바스크립트 node
- 깃허브
- 오라클
- 자바스크립트 element api
- 자바스크립트 객체
- oracle
- Oracle SQL
- ES6
- 다크웹
- 랜섬웨어
- 보안뉴스한줄요약
- 보안뉴스
- numpy
- 자바스크립트 API
- 파이썬
- 보안뉴스요약
- php
- 자바스크립트 prototype
- 자바스크립트 기본 문법
- 자바스크립트
Archives
- Today
- Total
FU11M00N
[C언어] 단일 링크드리스트 본문
연결 리스트란?
단일 링크드 리스트는 각각의 노드들이 데이터와 포인터를 가지고 있고,
한 줄로 연결이 되어있는 자료구조 중 하나입니다.
배열의 단점인 중간에 데이터를 삽입, 삭제를 못하고,
데이터를 정적으로 할당해줄수 없기때문에 비효율적입니다.
반면에 링크드리스트는 중간에 삽입,삭제,수정 등 이 가능하고
데이터를 malloc 함수를 이용해 동적으로 할당이 가능합니다.
제가 작성 한 코드는 추가 , 삽입 , 삭제 , 수정 , 출력 옵션이 있습니다.
사진 1-1은 추가 옵션으로 노드가 3개 생성되었을 때의 그림입니다.
1. 이름, 나이: 구조체로 생성하여 이름과 나이를 각각 입력받아 데이터를 저장하는 멤버 변수입니다.
2. 주소 : 다음 노드의 주소를 가리킬 포인터입니다.
3. head : head는 처음 노드의 주소를 가리킬 포인터입니다.
4. tail : tail는 마지막 노드의 주소를 가르킬 포인터 입니다.
각각 노드들은 다음 노드의 주소를 알고 있어 서로 연결되어 있는 모습입니다.
만약 노드 1과 노드 2 사이에 노드 4를 중간에 삽입하고 싶다면 사진 1-2과 같이 그림이 해석됩니다.
노드1의 포인터가 노드4를 가르키고 노드4의 포인터가 노드2를 가르키면,
노드들은 계속 연결이됩니다.
나머지 옵션들의 설명은 생략하겠습니다. 코드는 아래와 같습니다!
#include <stdio.h>
#include <stdlib.h>
typedef struct node{
char name[20];
int age;
struct node* next;
}node;
int menual();
node* show(node* p);
node* append(node* p);
node* insert(node* p);
node* deletion(node* p);
node* update(node* p);
void heapfree(node* p);
void heapfree(node* p){
node* tmp =p;
while(p!=NULL){
tmp=p->next;
free(p);
p=tmp;
}
printf("종료되었습니다!\n");
}
node* update(node* p){
int n,a;
int i;
show(p);
printf("수정하실 노드의 번호를 입력하세요!\n");
scanf("%d",&n);
if(n==1){
printf("수정하실 이름을 입력하세요!\n");
scanf("%s",p->name);
printf("수정하실 나이를 입력하세요!\n");
scanf("%d",&p->age);
}
else{
for(i=1; i<n; i++){
p=p->next;
}
printf("수정하실 이름을 입력하세요!\n");
scanf("%s",p->name);
printf("수정하실 나이를 입력하세요!\n");
scanf("%d",&p->age);
}
return p;
}
node* deletion(node* p){
node* start=p;
int i,n;
node* tmp;
printf("삭제 하실 번호를 입력하세요!!\n");
scanf("%d",&n);
if(n==1){
start=p->next;
free(p);
}
else{
for(i=1; i<n-1; i++){
p=p->next;
}
tmp=p->next;
p->next=p->next->next;
p=p->next;
free(tmp);
}
return start;
}
node* insert(node* p){
int pos,i;
node* item=(node*)malloc(sizeof(node));
node* start=p;
show(p);
printf("삽입하실 번호를 입력하세요!!.");
scanf("%d",&pos);
printf("삽입 할 이름을 입력하세요. ");
scanf("%s",item->name);
printf("삽입 할 나이를 입력하세요.");
scanf("%d",&item->age);
if(pos==1){
item->next=start;
start=item;
}
else{
for(i=1; i<pos-1; i++){
p=p->next;
}
item->next=p->next;
p->next=item;
}
return start;
}
node* show(node* p){
int i=0;
while(p->next!=NULL){
printf("[%d]번째 %s %d\n",++i,p->name,p->age);
p=p->next;
}
return p;
}
node* append(node* p){
printf("추가 할 이름을 입력하세요.\n");
fflush(stdin);
gets(p->name);
printf("추가 할 나이를 입력하세요.\n");
scanf("%d",&p->age);
p->next=(node*)malloc(sizeof(node));
p=p->next;
p->next=NULL;
return p;
}
int menual(){
int n;
printf("1.추가\n");
printf("2.출력\n");
printf("3.삽입\n");
printf("4.삭제\n");
printf("5.수정\n");
printf("6.종료\n");
scanf("%d",&n);
return n;
}
int main(){
node* tail,*head=(node*)malloc(sizeof(node));
head->next=NULL;
tail=head;
while(1){
switch(menual()){
case 1 :
tail=append(tail);
break;
case 2 :
show(head);
break;
case 3 :
head=insert(head);
break;
case 4 :
head=deletion(head);
break;
case 5 :
update(head);
break;
case 6:
heapfree(head);
break;
}
}
return 0;
}
'Programming > C Language' 카테고리의 다른 글
[C언어] Double Pointer (0) | 2020.08.13 |
---|---|
[C언어] C언어 매크로 정의 (0) | 2020.04.19 |
[C언어] printf 함수 (0) | 2020.04.19 |
C언어 비트 연산자 (1) | 2020.04.18 |
C언어 증감 연산자 (0) | 2020.04.18 |
Comments