1. 程式人生 > 實用技巧 >線性資料結構-複習

線性資料結構-複習

線性資料結構分為兩類,順序表和連結串列。

非線性資料結構就是其他的,比如樹,圖等。

線性資料結構的特點是,一對一,一個數據只有一個後繼和一個前驅;而非線性資料結構則是一對多。

順序表

順序表是個邏輯概念,順序表的相鄰元素在物理位置上也是相鄰的。通常我們採用陣列實現順序表,我們可能會把這兩者混為一談。陣列是基於順序表邏輯實現的,但在細微之處有些許差別,比如陣列下標從0開始,順序表下標從1開始。

順序表的特點是隨機存取方便,不可擴充。

連結串列

當我們需要存放大量動態的資料時,這時就需要連結串列登場了。連結串列不需要資料存在連續的位置,它的儲存結構是每個資料都有下一個結點的地址,所有的資料串成一條鏈,從第一個資料開始問,我們可以找到任何一個數據。相對於順序表直接給出了每個資料的位置編號,連結串列的查詢比較費事。

  • 連結串列一般都有頭節點,頭節點是特殊的結點,不存放資料,只方便資料的增刪,並且對於空表方便處理。所以,如連結串列有頭節點,空表的意思是除了頭節點沒有結點。
  • 除了上面的單向連結串列,連結串列還有雙向連結串列,迴圈連結串列,十字連結串列等變式。

連結串列的實現

/*資料結構*/
typedef struct node{
  int data;
  struct node *next;
}*listNode,*list;
/*連結串列建立,有一個頭節點,返回頭指標*/
list init_list(void){
  list L;
  L=(listNode)malloc(sizeof(struct
node)); L->next = NULL; return L; } /*刪除表(刪除表中所有結點,從頭開始刪,不刪除頭節點)*/ void delete_list(list L){ listNode p; p = L->next; while(p!=NULL){ L->next = p->next; free(p); p = L->next; } } /*插入結點(在頭節點處插入,頭插法,尾插法還需要個尾指標,簡言之,在哪個結點之後插入就需要一個指向哪個結點的指標)*/ void insert_node(list L,int
val){ listNode p; p = (listNode)malloc(sizeof(struct node)); p->data=val; p->next=L->next; L->next=p; } /*刪除結點(需要找到待刪除結點的前一個結點和後一個結點)*/ void delete_node(list L,listNode p){ listNode pre,next; pre = find_pre(L,p); next = p->next; if(pre!=NULL){ pre->next=next; free(p); } else printf("Error: node p not in the list."); } /*尋找結點p的前一個結點(用於刪除結點)*/ listNode find_pre(list L,listNode p){ listNode pnode=L; while(pnode->next!=NULL){ if(pnode->next==p) return pnode; pnode=pnode->next; } return NULL; } /*查詢表 (按照值查詢)*/ listNode find_node(list L,int val){ listNode p=L->next; while(p!=NULL){ if(p->data==val) return p; p=p->next; } return NULL; } /*列印連結串列*/ void print_list(list L){ listNode p=L->next; while(p!=NULL){ printf("ad: %p, val: %d\n",p,p->data); p = p->next; } }
View Code