(一)資料結構之線性表的簡單實現:連結串列
阿新 • • 發佈:2019-02-07
/* 查詢連結串列中第K個元素 */
List *FindKth( int K, List *PtrL )
{
List *p = PtrL;
int i = 1;
while (p != NULL && i < K )
{
p = p->Next;
i++;
}
if ( i == K ) return p; /* 找到第K個,返回指標 */
else return NULL; /* 否則返回空 */
}
3.5 修改操作
/* 修改元素值 */ void Change( ElementType X, int i, List *PtrL) { List *p; p = FindKth( i, PtrL ); /* 查詢第i個結點 */ if ( p == NULL ) { /* 第i-1個不存在,不能插入 */ printf("the node of i-1 is not exist!\n"); return ; } else { p->Data = X; } }
3.6 完整的示例程式碼實現
/* 線性表的鏈式儲存 */ #include <stdio.h> #include <stdlib.h> /* 基本資料結構定義 */ typedef int ElementType; typedef struct Node{ ElementType Data; struct Node *Next; } List; /* 銷燬一個連結串列,釋放記憶體空間 */ void MakeDestroy(List *PtrL) { List *PtrTemp = PtrL; List *PtrNext; while(PtrTemp) { PtrNext = PtrTemp->Next; free(PtrTemp); PtrTemp = PtrNext; } } /* 查詢連結串列中第K個元素 */ List *FindKth( int K, List *PtrL ) { List *p = PtrL; int i = 1; while (p != NULL && i < K ) { p = p->Next; i++; } if ( i == K ) return p; /* 找到第K個,返回指標 */ else return NULL; /* 否則返回空 */ } /* 查詢連結串列中值為X的元素 */ List *Find( ElementType X, List *PtrL ) { List *p = PtrL; while ( p!=NULL && p->Data != X ) p = p->Next; return p; } /* 在第i個結點位置上插入一個新結點 */ List *Insert( ElementType X, int i, List *PtrL ) { List *p, *s; if ( i == 1 ) { /* 新結點插入在表頭 */ s = (List *)malloc(sizeof(List)); /*申請、填裝結點*/ s->Data = X; s->Next = PtrL; return s; /*返回新表頭指標*/ } p = FindKth( i-1, PtrL ); /* 查詢第i-1個結點 */ if ( p == NULL ) { /* 第i-1個不存在,不能插入 */ printf("the node of i-1 is not exist!\n"); return NULL; } else { s = (List *)malloc(sizeof(List)); /*申請、填裝結點*/ s->Data = X; s->Next = p->Next; /*新結點插入在第i-1個結點的後面*/ p->Next = s; return PtrL; } } /* 刪除第i個結點 */ List *Delete( int i, List *PtrL ) { List *p, *s; if ( i == 1 ) { /* 若要刪除的是表的第一個結點 */ s = PtrL; /*s指向第1個結點*/ if (PtrL!=NULL) PtrL = PtrL->Next; /*從連結串列中刪除*/ else return NULL; free(s); /*釋放被刪除結點 */ return PtrL; } p = FindKth( i-1, PtrL ); /*查詢第i-1個結點*/ if ( p == NULL ) { printf("the node of i-1 is not exist!\n"); return NULL; } else if ( p->Next == NULL ) { printf("the node of i is not exist!\n"); return NULL; } else { s = p->Next; /*s指向第i個結點*/ p->Next = s->Next; /*從連結串列中刪除*/ free(s); /*釋放被刪除結點 */ return PtrL; } } /* 修改元素值 */ void Change( ElementType X, int i, List *PtrL) { List *p; p = FindKth( i, PtrL ); /* 查詢第i個結點 */ if ( p == NULL ) { /* 第i-1個不存在,不能插入 */ printf("the node of i-1 is not exist!\n"); return ; } else { p->Data = X; } } /* 遍歷這個連結串列中的元素 */ void Traversal(List *PtrL) { List *p; p = PtrL; while(p) { printf("%d ", p->Data); p = p->Next; } } /* 求表長 */ int Length ( List *PtrL ) { List *p = PtrL; /* p指向表的第一個結點*/ int j = 0; while ( p ) { p = p->Next; j++; /* 當前p指向的是第 j 個結點*/ } return j; } /* 程式入口 */ int main() { int i, index; ElementType temp; List *node; List *list = NULL; /* 防止野指標 */ /* 向連結串列中插入五個元素 */ printf("Input 5 numbers : "); for(i = 0; i < 5; i++) { scanf("%d", &temp); list = Insert(temp, i + 1, list); } printf("************************************Traversal*****************************\n"); /* 列印連結串列中的元素 */ Traversal(list); printf("Length = %d\n", Length(list)); printf("************************************Delete********************************\n"); /* 刪除一個元素 */ list = Delete(3, list); Traversal(list); printf("Length = %d\n", Length(list)); printf("************************************Insert********************************\n"); /* 插入一個元素 */ Insert(100, 2, list); Traversal(list); printf("Length = %d\n", Length(list)); printf("************************************Change********************************\n"); /* 插入一個元素 */ Change(888, 1, list); Traversal(list); printf("Length = %d\n", Length(list)); printf("************************************Find**********************************\n"); /* 查詢一個元素 */ node = Find(100, list); Traversal(list); printf("Length = %d, Value = %d\n", Length(list), node->Data); MakeDestroy(list); /* 銷燬這個連結串列 */ return 0; }