数据结构是计算机科学的基础,掌握各种数据结构的实现原理对于编写高效程序至关重要。本文将详细介绍线性表、链表、栈等基础数据结构的实现方法。
一、线性表的顺序存储实现 线性表是最基本的数据结构之一,其顺序存储方式使用连续的内存空间来存储数据元素。
1.1 使用指针实现 #include "stdio.h" #include "stdlib.h" #include "math.h" #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define MAXSIZE 20 typedef int Status; typedef int ElemType; /* 定义顺序表结构 */ typedef struct { ElemType data[MAXSIZE]; int length; } SqList; /* 初始化顺序表 */ Status InitList(SqList *L) { L->length = 0; return OK; } /* 判断顺序表是否为空 */ Status ListEmpty(SqList L) { if(L.length == 0) return TRUE; else return FALSE; } /* 清空顺序表 */ Status ClearList(SqList *L) { L->length = 0; return OK; } /* 获取顺序表长度 */ int ListLength(SqList L) { return L.length; } /* 获取第i个元素 */ Status GetElem(SqList L, int i, ElemType *e) { if(L.length == 0 || i < 1 || i > L.length) return ERROR; *e = L.data[i-1]; return OK; } /* 查找元素e的位置 */ int LocateElem(SqList L, ElemType e) { int i; if (L.length == 0) return 0; for(i = 0; i < L.length; i++) { if (L.data[i] == e) break; } if(i >= L.length) return 0; return i + 1; } /* 在第i个位置插入元素e */ Status ListInsert(SqList *L, int i, ElemType e) { int k; if (L->length == MAXSIZE) return ERROR; if (i < 1 || i > L->length + 1) return ERROR; if (i <= L->length) { for(k = L->length - 1; k >= i - 1; k--) L->data[k+1] = L->data[k]; } L->data[i-1] = e; L->length++; return OK; } /* 删除第i个元素 */ Status ListDelete(SqList *L, int i, ElemType *e) { int k; if (L->length == 0) return ERROR; if (i < 1 || i > L->length) return ERROR; *e = L->data[i-1]; if (i < L->length) { for(k = i; k < L->length; k++) L->data[k-1] = L->data[k]; } L->length--; return OK; } /* 遍历顺序表 */ Status ListTraverse(SqList L) { int i; for(i = 0; i < L.length; i++) printf("%d ", L.data[i]); printf("\n"); return OK; } 1.2 使用C++引用实现 #include <stdio.h> #include <stdlib.h> #define MaxSize 50 typedef char ElemType; typedef struct { ElemType data[MaxSize]; int length; } SqList; /* 创建顺序表 */ void CreateList(SqList *&L, ElemType a[], int n) { int i; L = (SqList *)malloc(sizeof(SqList)); for (i = 0; i < n; i++) L->data[i] = a[i]; L->length = n; } /* 初始化顺序表 */ void InitList(SqList *&L) { L = (SqList *)malloc(sizeof(SqList)); L->length = 0; } /* 销毁顺序表 */ void DestroyList(SqList *&L) { free(L); } /* 判断是否为空 */ int ListEmpty(SqList *L) { return(L->length == 0); } /* 获取长度 */ int ListLength(SqList *L) { return(L->length); } /* 显示顺序表 */ void DispList(SqList *L) { int i; if (ListEmpty(L)) return; for (i = 0; i < L->length; i++) printf("%c ", L->data[i]); printf("\n"); } /* 获取第i个元素 */ int GetElem(SqList *L, int i, ElemType &e) { if (i < 1 || i > L->length) return 0; e = L->data[i-1]; return 1; } /* 查找元素 */ int LocateElem(SqList *L, ElemType e) { int i = 0; while (i < L->length && L->data[i] != e) i++; if (i >= L->length) return 0; else return i + 1; } /* 插入元素 */ int ListInsert(SqList *&L, int i, ElemType e) { int j; if (i < 1 || i > L->length + 1) return 0; i--; for (j = L->length; j > i; j--) L->data[j] = L->data[j-1]; L->data[i] = e; L->length++; return 1; } /* 删除元素 */ int ListDelete(SqList *&L, int i, ElemType &e) { int j; if (i < 1 || i > L->length) return 0; i--; e = L->data[i]; for (j = i; j < L->length - 1; j++) L->data[j] = L->data[j+1]; L->length--; return 1; } 关键区别:
...