C言語なら俺に聞け

このエントリーをはてなブックマークに追加
417デフォルトの名無しさん
c言語の課題出されました。リスト構造の問題です。
struct node {int elem;struct node *next;};
struct node *list;
問1、中央のセルのポインタを返す関数list midcell(list L)を定義してください。
条件は単方向リストで。また中央のセルとは末尾のセルを除いて考えセルの個数が
2N個の場合N番目のセルのことをいいます。

よろしくお願いします。
418デフォルトの名無しさん:2014/02/13(木) 01:49:38.19
続きです
問2、連結リストLとその途中のセルのポインタMが与えられたとき
先頭LからMの直前のセルまでを切り離し順序を逆転させリストを返す関数
list revfR(list L,list M)を再帰関数で定義してください。
リストLは空でないと仮定します。また本問も単方向リストでお願いします。
問3、問2の機能を持つ関数list revf(list L,list M)を再帰関数を用いず定義してください
よろしくお願いします。
419デフォルトの名無しさん:2014/02/13(木) 02:03:27.76
>>418
>先頭LからMの直前のセルまでを切り離し順序を逆転させリスト
よくわからん

123456のリストでL=1、M=4 だったらどうなればよいの?
321456?
321?
654?
420デフォルトの名無しさん:2014/02/13(木) 04:55:56.72
>>402
おれ独学だけど、完全な独学とはいえない。雑誌(Cマガジンとか)
パソコン通信は、顔がみえないから、こわいひともいた。いろんなひとがいた
421デフォルトの名無しさん:2014/02/13(木) 04:56:51.34
2ちゃんねるは、雑音がおおすぎるから、やめたほうがいいよ
422デフォルトの名無しさん:2014/02/13(木) 05:16:48.69
>>417
1問目だけやってみた。
ちなみにコンパイルは通してない。

node* midcell(list* argList, int argSize)
{
 int i;
 node* pRetNode = pList;
 int iLen = argSize / 2;
 for(i = 0; i < iLen; i++){
  pRetNode = pRetNode->next;
 }
 return pRetNode;
}
423422:2014/02/13(木) 05:26:12.38
修正

typedef struct node{int elem; struct node *next;}NODE;

NODE* midcell(NODE* argList, int argSize)
{
 int i, iLen; NODE* pRetNode;

 pRetNode = pList; iLen = argSize / 2;
 for(i = 0; i < iLen; i++){
  pRetNode = pRetNode->next;
 }
 return pRetNode;
}
424デフォルトの名無しさん:2014/02/13(木) 05:30:29.61
こういうのはどうかね

node* midcell(list* top)
{
 node *n, *r;
 int f=0;
 for(n=r=top; n!=0; n=n->next, f=!f) {
   if(f) r=r->next;
 }
 return r;
}

もちろんコンパイルもテストもしてない
425デフォルトの名無しさん:2014/02/13(木) 07:12:02.30
つ(3)
list *p, *q, *R, S[100], int i = 0;
for (p = L; p->next != M; p = p->next)
 if (p->next == NULL) return (list)NULL;
for (; p->next; S[i++] = p = p->next)
 if (p->next == M) return (list)NULL;
for (R = S[--i]; p != M; q = S[--i], p->next = q->next, p = q)
 if (i == 0) return (list)NULL;
p->next = NULL;
return R;

もちろんコンパイルもテストもしてない
426デフォルトの名無しさん:2014/02/13(木) 11:07:10.40
>>419
321になります。
また関数の引数の個数は問題と同じで数でお願いします