掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26880

リスト構造
投稿者---TAK(2006/05/17 09:46:14)


問題が、リストのk番目のnodeの後ろに新しいnodeを(データy)を追加する関数とリストのk番目のnodeを削除する関数を作成するというもので、

k番目の削除が上手くいかないので、どなたか教えてください!
if文が3つあるうち、2つが分かりません。

リストのk番目のnodeの後ろに新しいnodeを(データy)を追加する関数は何とかできました。


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

#define eltype int 

#define BUFLEN 100 

typedef struct node { 
eltype data; 
struct node *next; 
}LISTEL; 

struct node *root; 

/**** 関数の定義*****/ 



void construct_list() 
{ 
 struct node *p; 
 int n,y; 
 int i,k, noIndex[50]; 
 char buf[BUFLEN]; 

  while(1) { 
  printf("データ入力 :"); 
  fgets(buf, sizeof(buf), stdin); 
  if(buf[0] == '\n') return; 

   i=0 ,k=0; 
    if (buf[i]!= ' '){ 
noIndex[k++] = i; 
} 

     while(buf[i]!= '\0'){ 
      i++; 
         if ( buf[i-1]==' ' && buf[i]!=' ' && buf[i]!= '\n'){ 
noIndex[k++] =i; 
} 
} 

       if(buf[i-1] != '\n'){ 
        fprintf(stderr,"too long input. Terminate now!\n"); 
         exit(1); 
     } 

for (i=0; i<k; i++){ 
   n = sscanf(&buf[noIndex[i]], "%d", &y); 
    if(n != 1){ 
fprintf(stderr,"Input error!! [non-number charavters] -> %s", &buf[noIndex[i]]); 
continue; 
} 

   p = (struct node *)malloc(sizeof(LISTEL)); 
     p->data = y; 
     p->next = root; 
   root = p; 
 } 
} 
} 

   void print_list() 
   { 
    struct node *p; 
     p = root; 
      if (p == NULL){ 
         fprintf(stderr,"リストにデータがありません!\n"); 
          return; 
     } 
       printf("List Data :  "); 
        while(p!= NULL){ 

         printf(" %4d", p->data); 
         p =p->next; 
    } 
        printf("\n"); 
} 

struct node *search(int x) 
{ 
   struct node *p; 

   p = root; 
     while(p!= NULL){ 
      if (p->data == x){ 
        printf("%d found.\n", x); 
        return p; 
   } 
   else{ 
    p = p->next; 
  } 
} 
      printf("%d not found.\n", x); 
    return NULL; 
 } 




int onedata_input(int *d) 
{ 
  int i, n; 
  char buf[10]; 

    while(1){ 
    fgets(buf, sizeof(buf),stdin); 
   i=0; 
    while(buf[i]!='\0'){ 
    i++; 
 } 
   if(i==1) { // No data-input is done. 

 return 0; 
} 
   if(buf[i-1] != '\n'){ 
    fprintf(stderr,"too long input. Terminate now!\n"); 
   exit(1); 
 } 
   n = sscanf(buf,"%d", d); 
    if(n == 1){ //One data-input is done. 

   return 1; 
  } 
/* fprintf(stderr,"データを再入力 :");*/ 
} 
} 






void insert_node(int k,eltype y) 
{ 
/*リストのk番目のnodeの後ろに新しいnodeを(データy)を追加する関数を作成する*/ 

struct node *p, *q;
  
  p=root;
  if ( k < 0 )
     return;

 for ( p > 0  ; p ; p = p->next ){
        // 指定要素なら

   if ( k-- == 1 ){
            
// メモリー確保

q = (struct node *)malloc(sizeof(LISTEL));


// 新しく確保したメモリーにデータをコピーする

 q->data=y;  


// リストのつなぎ換え

q->next= p->next;
  p->next =q;

  return;
   }

 }



} 



void delete_node(int k) 
{ 

/*リストのk番目のnodeを削除する関数を作成する。
*/ 

struct node *p,*q;

 
  int i;
 q=root;
  if ( k <= 0 ){
  printf("削除不可") ;   
 return;
  }

 if ( ?){
   root=q ;
  free(q); 
printf("削除不可") ;   
 return;
  }
 
    
 p=NULL;
    for ( i=1  ; i<k ; i++ ){
        

// 削除

        if ( ?){
            // リストのつなぎ換え

            q->next = p->next;
        


            // k番目のリストを解放する

            free (p);

            return;
        }
        p = q;
        q  = p->next;
    }
    
    


} 






/**** メインプログラムの宣言 *****/ 
int main(void) 
{ 
int n,dd,ps; 
int i; 
char buf[BUFLEN]; 


root = NULL; 
construct_list(); 
print_list(); 

printf("削除場所を入力:"); 
while (onedata_input(&ps)==1){ 
printf("input data:"); 
if (onedata_input(&dd)==0){ 
break; 
} 
insert_node(ps,dd); 
print_list(); 
printf("削除場所を入力:"); 
} 

printf("削除場所を入力:"); 
while (onedata_input(&ps)==1){ 
delete_node(ps); 
print_list(); 
printf("削除場所を入力:"); 
} 


return 0; 
} 
/**実行結果** 

データ入力:9 8 7 6 5 4 3 2 1 
データ入力: 
List Data: 1 2 3 4 5 6 7 8 9 
挿入場所を入力:6 
挿入データを入力:66 
List Data: 1 2 3 4 5 6 66 7 8 9 
挿入場所を入力:4 
挿入データを入力:44 
List Data: 1 2 3 4 44 5 6 66 7 8 9 
挿入場所を入力: 
削除場所を入力:5 
List Data: 1 2 3 4 5 6 66 7 8 9 
削除場所を入力:7 
List Data: 1 2 3 4 5 6 7 8 9 
削除場所を入力: 

**************/



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:リスト構造 26884 Hermit 2006/05/17 22:24:24


No.26884

Re:リスト構造
投稿者---Hermit(2006/05/17 22:24:24)


インデントがぐちゃぐちゃですね。
何かの課題でしょうか?
課題だったら、ここの掲示板の意向に反するかも知れませんので
ソース部分は見ないように(^^;

追加時、削除時、root を変える必要がでてきた時の対処が必要ですので、
以下のようにしてみました。

/*リストのk番目のnodeの後ろに新しいnodeを(データy)を追加する関数を作成する*/ 
void insert_node(int k,eltype y) {
  struct node *p = root, **last = &root;
  if ( k < 0 )
    goto error;
  while (p){
    if ( k-- == 0 ){
      struct node *q = (struct node *)malloc(sizeof(LISTEL));
      q->data = y;  
      q->next = p;
      *last = q;
      return;
    }
    last = &p->next;
    p = p->next;
  }
error:
  printf("追加できませんでした\n");
} 


/*リストのk番目のnodeを削除する関数を作成する。*/ 
void delete_node(int k) {
  struct node *p = root, **last = &root;
  if ( k <= 0 )
    goto error;
  while (p){
    if (--k == 0){
      *last = p->next;
      free (p);
      return;
    }
    last = &p->next;
    p = p->next;
  }
error:
  printf("削除できませんでした\n");
}



この投稿にコメントする

削除パスワード

No.26885

Re:リスト構造
投稿者---Hermit(2006/05/17 23:05:17)


まずい、私が書いた
insert_node
バグってます。
こいつは忘れてください(^^;


この投稿にコメントする

削除パスワード

No.26887

Re:リスト構造
投稿者---Hermit(2006/05/17 23:28:43)


バグってたので書き直してみましたが・・・
あまり綺麗に書けなかったので、参考にはならないかも。

/*リストのk番目のnodeの後ろに新しいnodeを(データy)を追加する関数を作成する*/ 
void insert_node(int k,eltype y) {
  struct node **p = &root;
  if ( k < 0 )
    goto error;
  for (;;) {
    if ( k-- == 0 ){
      struct node *q = (struct node *)malloc(sizeof(LISTEL));
      q->data = y;  
      q->next = *p;
      *p = q;
      return;
    }
    if (*p == NULL) break;
    p = &(*p)->next;
  }
error:
  printf("追加できませんでした\n");
} 



この投稿にコメントする

削除パスワード

No.26912

ありがとうございます!!
投稿者---TAK(2006/05/20 08:55:32)


「goto」の部分は習っていなかったので今まで知りませんですが、結構便利ですね〜。
参考になりました!どうもありがとうございます。


この投稿にコメントする

削除パスワード

No.26913

Re:ありがとうございます!!
投稿者---Hermit(2006/05/20 12:40:54)


>「goto」の部分は習っていなかったので今まで知りませんですが、結構便利ですね〜。
便利だけど、安易に使うと、後々どういうことをしてるのかわからなくなるので、
最初のうちは使わない様に心がけて書いたほうがいいですよ。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧