c언어 단일연결리스트 노드 삭제 삽입

c언어 단일연결리스트 노드 삭제 삽입

작성일 2012.11.04댓글 1건
    게시물 수정 , 삭제는 로그인 필요

 
 

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

struct link_list
{
 char* name;
 struct link_list* next;
};
typedef struct link_list node;
typedef node* link;

link createnode(char* name);
link append(link head,link cur);
int printlist(link head);
link deletenode(link head,int n);
link insertnode(link head,link cur,int n);
void main(void)
{
 char name[30];
 link head=NULL;
 link cur;

 printf("이름 입력\n");
 gets(name);
 while(!feof(stdin))
 {
  cur=createnode(name);
  if(cur==NULL)
   exit(1);
  head=append(head,cur);
  printlist(head);
  gets(name);

 }
}
    link cretenode(char* name)
 {
  link cur;
  cur=(node*)malloc(sizeof(node));
  if(cur==NULL)
  {
   printf("실패");
   return NULL;
  }
  cur->name=(char*)malloc(sizeof(char)*strlen(name)+1);
  strcpy(cur->name,name);
  cur->next;
  return cur;
 }
 link append(link head,link cur)
 {
  link nextnode=head;
  if(head==NULL)
  {
   head=cur;
   return head;
  }
  while(nextnode->next!=NULL)
  {
   nextnode=nextnode->next;
  }
  nextnode->next=cur;
  return head;

 }
 int prinlist(link head)
 {
  int cnt=0;
  link nextnode=head;
  while(nextnode!=NULL)
  {
   printf("%3d번째 노드는 %s\n",++cnt,nextnode->name);
   nextnode=nextnode->next;
  }
  return cnt;
 }

link deletenode(link head,int n);
link insertnode(link head,link cur,int n);
정수입력해서 n번째 노드삭제 , 삽입 하는 함수점 부탁드립니다. 잘돼지않아서 부탁드려요


#c언어 단일연결리스트

profile_image 익명 작성일 -

ㅁ -> ㅁ -> ㅁ-> .......ㅁ-> ㅁ ->..........ㅁ-> NULL 
1        2       3     .......        n      

의 n개의 싱글 링크드 리스트가 있을 때 
n번 노드를 지우고자 할 경우 

ㅁ -> (ㅁ ->) ㅁ-> ...............->NULL
n-1           (n)    n+1

n번을 free시키고 

ㅁ->  ㅁ-> ...............-> NULL
n-1      n+1 

n-1뒤에 바로 n+1이 오게 해야됨.
그래서 임시 포인터가 2개 필요함 하나는 삭제할 노드를 가리키는 포인터, 하나는 n-1과 n+1을 연결하기위해서( 이 부분이 이해가 잘 안되면 책에서 노드 삭제하는 부분 찾아보세요)

대충 코드를 짜면 ......... 님 코드를 전부 본 것이 아니라 오류가 나거나 leak생길 수 있음.최적화된 코드가 아닙니다.
 link deletenode(link head,int n)
{
link temp,temp2;

printf(" 몇 번째 노드를 삭제하시겠습니까?\n");
scanf("%d", &n);
temp = (link)malloc(sizeof (link)); //지울 노드를 가리킬 node포인터
temp = head;
for( i = 0 ; i < n-1 ; i++ )       //n-1번째 노드까지 temp를 이동
{
if( temp->next == NULL ) // n이 노드의 갯수보다 큰 경우처리 (님이 좀 더 고쳐보세요)
break;
temp = temp->next;
}
temp2 = (link)malloc(sizeof (link));  //삭제된 노드의 이전과 다음을 연결시켜주기위함
temp2 = temp;
if( temp->next != NULL)//마지막 이전의 노드가 아닐 때
{
temp = temp->next;//n-1까지 이동한 temp를 1번 더 이동 (n번째를 가리킴)
temp2->next = temp->next;//(삭제할 노드의 이전노드와 다음노드를 연결)
}
else //마지막 노드일 때 
{
temp = temp->next;//한번더 이동하여 n번째 노드를 지움
free(temp); 
}
free(temp);
}
link insertnode(link head,link cur,int n)
{
link newnode,temp,temp2;
for( i = 0 ; i < n-1 ; i++ )
{
if( temp->next == NULL )
break;
temp = temp->next;
}
temp2 = temp->next; 
newnode = createnode("sdlkfjsf");
temp->next = newnode;
newdode->next = temp2;

c언어 단일 연결리스트 노드삭제

질문 제목 : 단일 연결리스트 원하는 노드 삭제 함수 구현 질문 요약 : 삭제노드의 이전노드로 이동 질문 내용 : link deletnode(link head,int n) { int i;...