私はこれら 2 つの構造を使用しています。1 つ目は従業員情報を保持し、2 つ目はリスト情報を保持します。
typedef struct ListNodeTag{
int idNumber;
struct ListNodeTag *next;
} Employee;
typedef Employee Item;
typedef struct {
int size;
Item *head;
} List;
Peek という関数を使用して、位置、リストの先頭、および Employee 以外の要素へのポインターを送信します。
void Peek (int position, List *L, Item *X) {
int i;
Item *currentPtr;
currentPtr = L->head;
for(i = 0; i < position; i++){
if(currentPtr->next == NULL){
X = currentPtr;
break;
}
currentPtr = currentPtr->next;
}
X = currentPtr;
}
このループで main から関数 Peek を呼び出します。
for(i=0;i<Length(&L);i++){
Peek(i,&L,&S);
printf(" %d%\n",idNumber);
}
その目的は、リストの各メンバーを従業員 ID と共に新しい行に出力することです。ただし、リストの最初のメンバーは、2 番目のメンバーが呼び出されると、その行でセグ フォールトが発生します。currentPtr = currentPtr->next;
リスト内のデータは、次の挿入関数から取り込まれます。
void Insert (Item X, int position, List *L) {
int i;
Item *currentPtr,*previousPtr;
Item *temp = malloc(sizeof(Item));
temp->idNumber = X.idNumber;
temp->next = NULL;
previousPtr = NULL;
if(L->head == NULL){
L->head = temp;
}
else{
currentPtr = L->head;
for(i=0;i<=position && currentPtr!=NULL;i++){
previousPtr = currentPtr;
currentPtr = currentPtr->next;
}
temp->next = currentPtr;
previousPtr->next = temp;
}
L->size +=1;
}
印刷すると、セグメンテーション違反なしで結果を取得できますが、リストが長くても同じエントリが繰り返されます。EG: 長さ 3 の場合、次のようになります。
10925
10925
10925