線性表的定義與操作---連結串列
阿新 • • 發佈:2019-01-06
typedef struct LNode *PtrToLNode;
struct LNode {
ElementType Data;
PtrToLNode Next;
};
typedef PtrToLNode Position;
typedef PtrToLNode List;
/* 查詢 */
#define ERROR NULL
Position Find( List L, ElementType X )
{
Position p = L; /* p指向L的第1個結點 */
while ( p && p->Data!=X )
p = p->Next;
/* 下列語句可以用 return p; 替換 */
if ( p )
return p;
else
return ERROR;
}
/* 帶頭結點的插入 */
/*注意:在插入位置引數P上與課程視訊有所不同,課程視訊中i是序列位序(從1開始),這裡P是連結串列結點指標,在P之前插入新結點 */
bool Insert( List L, ElementType X, Position P )
{ /* 這裡預設L有頭結點 */
Position tmp, pre;
/* 查詢P的前一個結點 */
for ( pre= L; pre&&pre->Next!=P; pre=pre->Next ) ;
if ( pre==NULL ) { /* P所指的結點不在L中 */
printf("插入位置引數錯誤\n");
return false;
}
else { /* 找到了P的前一個結點pre */
/* 在P前插入新結點 */
tmp = (Position)malloc(sizeof(struct LNode)); /* 申請、填裝結點 */
tmp->Data = X;
tmp->Next = P;
pre->Next = tmp;
return true;
}
}
/* 帶頭結點的刪除 */
/*注意:在刪除位置引數P上與課程視訊有所不同,課程視訊中i是序列位序(從1開始),這裡P是擬刪除結點指標 */
bool Delete( List L, Position P )
{ /* 這裡預設L有頭結點 */
Position tmp, pre;
/* 查詢P的前一個結點 */
for ( pre=L; pre&&pre->Next!=P; pre=pre->Next ) ;
if ( pre==NULL || P==NULL) { /* P所指的結點不在L中 */
printf("刪除位置引數錯誤\n");
return false;
}
else { /* 找到了P的前一個結點pre */
/* 將P位置的結點刪除 */
pre->Next = P->Next;
free(P);
return true;
}
}