게시판 즐겨찾기
편집
드래그 앤 드롭으로
즐겨찾기 아이콘 위치 수정이 가능합니다.
C언어]안녕하세요.. 도움 부탁드립니다.
게시물ID : programmer_22266짧은주소 복사하기
작성자 : 코린이막내
추천 : 0
조회수 : 887회
댓글수 : 2개
등록시간 : 2018/04/07 16:38:02
안녕하세요 컴퓨터공학과 재학중인 학생입니다.
컴퓨터 공학과 재학중임에도 c언어, 프로그래밍 전공분야에서 적성과 맞지않아 애를 많이먹고있습니다...

최근 자료구조과목을 이수하면서 교수님께서 과제를 내주셨습니다.
수업도 열심히듣고있고, 과제해결을 하기위해 책도 여러번읽고 구글 네이버도 뒤져가며 열심히 하고있지만
좀처럼 쉽지가 않습니다... 기초가 부족해서인지 참 어렵기만 하네요.

그래서 이렇게 도움을 요청하고자 글을 쓰게 되었습니다.
다는 못드리겠지만, 괜찮으시다면 도움주신분 한분께 사례의 의미로 카페 기프티콘 보내드리겠습니다.

배열을 이용한 리스트 ADT에서의 라인에디터 프로그램 코드입니다.
다음 프로그램을 실행하다 보면 정상작동 하기까지 오류가 발생하는것들이 꽤나 있습니다.
그 것을 5가지정도 발견해서 고쳐오는것이 과제인데요,
제가 고친것은 최초 입력단계에서 입력되지않아 fflush함수 앞에 getchar함수로 널문자를 빼서 입력받을수 있게 하는것 정도였습니다.

라인에디터에서 1번행으로 바로 삽입했을때 출력되지 않는 현상도 있었고,
파일입력을 했을 경우에도 출력되지 않았습니다.

어떤 부분을 어떻게 고치면 될까요.. 또 c언어는 도대체 어떻게 공부해야 잘 할 수 있는걸까요.
전공에 대한 고민이 참 많아지네요.. 도움 부탁드립니다.

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>

#define MAX_CHAR_PER_LINE 1000
#define MAX_CHAR_PER_LINE 1000
#define MAX_NAME 256
void warning(char *);
void error(char *);

#define FALSE 0
#define TRUE 1

typedef struct {
char a[MAX_CHAR_PER_LINE];
} element;
typedef struct ListNode {
element data;
struct ListNode *link;
} ListNode;
typedef struct {
ListNode *head;
int length;
} ListType;

void insert_node(ListNode **phead, ListNode *p,
ListNode *new_node)
{
if (*phead == NULL) {
new_node->link = NULL;
*phead = new_node;
}
else if (p == NULL) {
new_node->link = *phead;
*phead = new_node;
}
else {
new_node->link = p->link;
p->link = new_node;
}
}

void remove_node(ListNode **phead, ListNode *p, ListNode *removed)
{
if (p == NULL)
*phead = (*phead)->link;
else
p->link = removed->link;
free(removed);
}

void init(ListType *list)
{
if (list == NULL) return;
list->length = 0;
list->head = NULL;
}

ListNode *get_node_at(ListType *list, int pos)
{
int i;
ListNode *tmp_node = list->head;
if (pos < 0) return NULL;
for (i = 0; i<pos; i++)
tmp_node = tmp_node->link;
return tmp_node;
}

int get_length(ListType *list)
{
return list->length;
}


void add(ListType *list, int position, element data)
{
ListNode *p;
if ((position >= 0) && (position <= list->length)) {
ListNode*node = (ListNode *)malloc(sizeof(ListNode));
if (node == NULL) error("메모리 할당에러");
node->data = data;
p = get_node_at(list, position - 1);
insert_node(&(list->head), p, node);
list->length++;
}
}

void add_last(ListType *list, element data)
{
add(list, get_length(list), data);
}

void add_first(ListType *list, element data)
{
add(list, 0, data);
}

int is_empty(ListType *list)
{
if (list->head == NULL) return 1;
else return 0;
}

void delete(ListType *list, int pos)
{
if (!is_empty(list) && (pos >= 0) && (pos < list->length)) {
ListNode *p = get_node_at(list, pos - 1);
remove_node(&(list->head), p, (p != NULL) ? p->link : NULL);
list->length--;
}
}

element get_entry(ListType *list, int pos)
{
ListNode *p;
if (pos >= list->length) error("위치 오류");
p = get_node_at(list, pos);
return p->data;
}

void clear(ListType *list)
{
int i;
for (i = 0;i<list->length;i++)
delete(list, i);
}

void display(ListType *buffer)
{
int i;
ListNode *tmp_node;
tmp_node = buffer->head;

printf("**************\n");
for (i = 0;i<buffer->length;i++) {
printf("%s", tmp_node->data.a);
tmp_node = tmp_node->link;
}
printf("**************\n");
}

void warning(char *message)
{
fprintf(stderr, "%s\n", message);
}

void error(char *message)
{
fprintf(stderr, "%s\n", message);
exit(1);
}

void help()
{
printf("**************\n");
printf("i: 입력\n");
printf("d: 삭제\n");
printf("r: 파일읽기\n");
printf("w: 파일쓰기\n");
printf("q: 종료\n");
printf("**************\n");
}

void read_file(ListType *buffer)
{
char fname[MAX_NAME];
FILE *fd;
element p;

if (!is_empty(buffer)) {
clear(buffer);
}
init(buffer);

printf("파일 이름: ");
scanf("%s", fname);
if ((fd = fopen(fname, "r")) == NULL) {
warning("파일을 열수없습니다.");
return;
}
while (fgets(p.a, MAX_CHAR_PER_LINE, fd)) {
add_last(buffer, p);
}
fclose(fd);
display(buffer);
}

void write_file(ListType *buffer)
{
FILE *fd;
char fname[MAX_NAME];
element p;
int i;

printf("파일 이름: ");
scanf("%s", fname);
if ((fd = fopen(fname, "w")) == NULL) {
printf("파일을 열수없습니다.\n");
return;
}
for (i = 0;i<get_length(buffer);i++) {
p = get_entry(buffer, i);
fputs(p.a, fd);
}
fclose(fd);
display(buffer);
}

void delete_line(ListType *buffer)
{
int position;

if (is_empty(buffer))
printf("지울 라인이 없습니다.\n");
else
{
printf("지우고 싶은 라인번호를 입력하세요:\n");
scanf("%d", &position);
delete(buffer, position);
}
display(buffer);
}

{
int position;
char line[MAX_CHAR_PER_LINE];
element p;

printf("입력행번호를 입력하세요: \n");
scanf("%d", &position);

printf("내용을 입력하세요: ");
fflush(stdin);
fgets(line, MAX_CHAR_PER_LINE, stdin);
strcpy(p.a, line);
add(buffer, position, p);
display(buffer);
}

void do_command(ListType *buffer, char command)
{
switch (command)
{
case 'd':
delete_line(buffer);
break;
case 'i':
insert_line(buffer);
break;
case 'r':
read_file(buffer);
break;
case 'w':
write_file(buffer);
break;
case 'q':
break;
}
}

void main()
{
char command;
ListType buffer;

init(&buffer);
do {
help();
command = getchar();
do_command(&buffer, command);
fflush(stdin);
} while (command != 'q');
}

전체 추천리스트 보기
새로운 댓글이 없습니다.
새로운 댓글 확인하기
글쓰기
◀뒤로가기
PC버전
맨위로▲
공지 운영 자료창고 청소년보호