資料結構---線性表(離散儲存)
阿新 • • 發佈:2018-12-12
LinkList.h:結構的定義,基本函式的申明
#ifndef __LINKLIST_H__ #define __LINKLIST_H__ //一些庫函式的標頭檔案包含 #include <string.h> #include <ctype.h> #include <malloc.h> #include <limits.h> #include <stdio.h> #include <stdlib.h> #include <io.h> #include <math.h> //自定義bool typedef int Boolean; //定義函式返回狀態 typedef int Status; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 typedef struct Node { int data; struct Node *next; }LNode,*LinkList; /* 初始化 */ Status init(LinkList *list); /* 銷燬 */ Status destroy(LinkList *list); /* 重置 */ Status clear(LinkList list); /* 判空 */ Boolean isEmpty(LinkList list); /* 獲取已存元素的數量 */ int listLen(LinkList list); /* 獲取指定索引的元素 */ Status getElem(LinkList list, int index, int *elem); /* 獲取給定元素值,並滿足關係的第一個元素的索引 */ int LocateElem(LinkList list, int elem, int (*comp)(int, int)); /* 獲取元素的前驅 */ Status getPriorElem(LinkList list, int elem, ElemType *pre_); /* 獲取元素的後繼 */ Status getNextElem(LinkList list, int elem, int *next_); /* 插入一個元素 */ Status insertElem(LinkList list, int index, int elem); /* 刪除一個元素 */ Status deleteElem(LinkList list, int index, int *del_elem); /* 根據給定關係改變元素的值 */ Status traverse(LinkList list, void (*update)(int *) ); #endif
LinkList.c 函式的實現
#include "LinkList.h" /* 初始化 */ Status init(LinkList *list) { *list = (LinkList)malloc(sizeof(LNode)); if(*list == NULL) { printf("動態記憶體分配失敗"); exit(-1); } (*list)->next = NULL; return OK; } /* 銷燬,連頭結點空間也要釋放 */ Status destroy(LinkList *list) { LinkList p ; while(!(*list)) { p = (*list)->next; free(*list); *list = p; } *list = NULL; return OK; } /* 重置 除頭結點外的其他結點都要釋放*/ Status clear(LinkList list) { LinkList q,p = list->next; while(!p) { q = p->next; free(p); p = q; } list->next = NULL; return OK; } /* 判空 */ Boolean isEmpty(LinkList list) { if(list->next == NULL) { return TRUE; } else { return FALSE; } } /* 獲取已存元素的數量 */ int listLen(LinkList list) { int i=0; LinkList p = list->next; while(!p) i++; p = p->next; } return i; } /* 獲取指定索引的元素 */ Status getElem(LinkList list, int index, int *elem) { int i=0; LinkList p = list->next; while(i < index && p) //從首結點開始向後遍歷,到索引位置停止 { i++; p = p->next; } if(i > index || !p) { return ERROR; } *elem = p->data; return OK; } /** * 獲取給定元素值,並滿足關係的第一個元素的索引 * comp函式型別的返回值是1或0,1表示滿足條件,0表示不滿足條件 **/ int LocateElem(LinkList list, int elem, int (*comp)(int, int)) { LinkList p = list->next; int i=0; while(p) { if(comp(p->data, elem)) { return i; } p = p->next; i++; } return -1; } /* 獲取元素的前驅 */ Status getPriorElem(LinkList list, int elem, int *pre_) { LinkList q,p = list->next; while(p && p->next) { q = p->next; if(q->data == elem) { *pre_ = p->data; return OK; } p = q; } return ERROR; } /* 獲取元素的後繼 */ Status getNextElem(LinkList list, int elem, int *next_) { LinkList p = list->next; while(p && p->next) //如果獲取第i個元素的後繼,則i+1也必須是有效元素 { if(p->data == elem) { *next_ = p->next->data; return OK; } p = p->next; } return ERROR; } /* 插入一個元素 */ Status insertElem(LinkList list, int index, int elem) { int i=0; LinkList s,p = list; while(i < index && p) //找到索引的前一個位置 { p = p->next; i++; } if(i > index || !p) { return ERROR; } s = (LinkList)malloc(sizeof(LNode)); s->data = elem; s->next = p->next; //將第i個元素移動到新結點的後面,即新結點的指標域設為第i個元素的結點 p->next = s; //將第i-1個元素的指標域設為新的結點 return OK; } /* 刪除一個元素 */ Status deleteElem(LinkList list, int index, int *del_elem) { int i=0; LinkList q,p = list; while(p && i < index) { p = p->next; i++; } if(i > index || !p) { return ERROR; } q = p->next; // 將待刪的結點賦值給q p->next = q->next; //將待刪結點的指標域 賦值給 待刪結點的前一個結點的指標域 *del_elem = q->data; free(q); return OK; } /* 根據給定關係改變元素的值 */ Status traverse(LinkList list, void (*update)(int *)) { LinkList p = list->next; while(p) { update(&(p->data)); p = p->next; } printf("\n"); return OK; }