1. 程式人生 > >【資料結構專題】線性表之單鏈表

【資料結構專題】線性表之單鏈表

 對比了好幾本書,比較少涉及單鏈表的賦值,為了親自跑出其他功能,花了不少時間,畢竟是打基礎嘛,相信以後會越來熟練(你為什麼那麼熟練,明明是我先~)話不多說,下面是程式碼及實驗結果。
 
這裡寫圖片描述

#include <cstdio>
#include <cstdlib>
#define  ElementType int
#define MAXSIZE 1000
#define ERROR -1


/*線性表-順序表-結構體定義*/
typedef struct LNode *PtrToLNode;
struct LNode {
    ElementType Data;
    PtrToLNode Next;                                       /*最後一個位置下標,用來計算順序表的長度*/
}; struct LNode L; PtrToLNode PtrL = &L; /*初始化-賦值*/ PtrToLNode CreatNewList(PtrToLNode PtrL , int data){ PtrToLNode q = PtrL; PtrToLNode p = (PtrToLNode)malloc(sizeof(struct LNode)); p->Next = NULL; p->Data = data; if( NULL == PtrL ){ PtrL = p; } else{ while
(q->Next) q = q->Next; q->Next = p; } return PtrL; } /*遍歷-列印*/ int ShowNewList(PtrToLNode PtrL ){ PtrToLNode p = PtrL; while(p){ printf("%d",p->Data); p = p->Next; } printf("\n"); return 1; } /*遍歷-求表長*/ int Length(PtrToLNode PtrL){ PtrToLNode p = PtrL; /*p指向表第一個節點*/
int j = 0; while(p){ p = p->Next; j++; /*此時p指向第j個節點*/ } return j; } /* 按序查詢 */ /* 查詢第K個數,並返回其值的指標 */ PtrToLNode FindKth( int K, PtrToLNode PtrL ) { PtrToLNode p = PtrL; /*p指向表第一個節點*/ int i = 1; while( p != NULL && i < K ){ p = p->Next; i++; } if ( i == K ) return p; /* 如果找到,返回指標 */ else return NULL; } /* 按值查詢 */ /* 查詢X,並返回其值位置 */ int Find( int X, PtrToLNode PtrL ) { PtrToLNode p = PtrL; /*p指向表第一個節點*/ int j = 1; while( p != NULL && p->Data != X ){ p = p->Next; j++; } return j; } /* 插入 */ /* 必須知道前一個節點才能插入 */ PtrToLNode Insert( PtrToLNode PtrL, ElementType X, int i ) { PtrToLNode p,s; if(i == 1){ //第一個節點特殊處理 s = (PtrToLNode)malloc(sizeof(struct LNode)); s->Data = X; s->Next = PtrL; return s; } p = FindKth(i-1,PtrL); if(p == NULL){ printf("引數i錯誤"); return NULL; } else{ s = (PtrToLNode)malloc(sizeof(struct LNode)); s->Data = X; s->Next = p->Next; p->Next = s; return PtrL; } } /* 刪除 */ /* 必須知道前一個節點才能刪除 */ PtrToLNode Delete( PtrToLNode PtrL, int i){ PtrToLNode p,s; if(i == 1){ //第一個節點特殊處理 s = PtrL; if(PtrL != NULL) PtrL = PtrL->Next; //鏈跳過第一個節點 else return NULL; free(s); return PtrL; } p = FindKth(i-1,PtrL); if(p == NULL){ printf("第 %d 個結點不存在",i-1); return NULL; } else if(p->Next == NULL){ printf("第 %d 個結點不存在",i-1); return NULL; } else{ s = p->Next; p->Next = s->Next; //跳過s free(s); return PtrL; } } void DestoryList( PtrToLNode PtrL ) { PtrToLNode p; if(PtrL == NULL) return; while(PtrL) { p = PtrL; PtrL=PtrL->Next; free(p); } } int main() { int i,l,n,x,K,j,X; int m,M,d; PtrToLNode PtrL,find1,find2; scanf("%d",&n); for(i = 0; i < n; i++){ scanf("%d",&x); PtrL = CreatNewList(PtrL , x); } l = Length(PtrL); printf("Length = %d \n",l); ShowNewList(PtrL); printf("Find Kth number, input K :"); scanf("%d",&K); find1 = FindKth( K, PtrL ); printf("Kth = %d\n",find1->Data); printf("Find a number, input number :"); scanf("%d",&X); j = Find( X, PtrL ); printf("%d is in the %d th position\n", X,j); printf("insert m in M ,input m M :"); scanf("%d %d",&m,&M); PtrL = Insert( PtrL, m, M ); ShowNewList(PtrL); printf("delete d th number, input d :"); scanf("%d",&d); PtrL = Delete( PtrL, d); ShowNewList(PtrL); DestoryList(PtrL); return 0; }