本文共 4219 字,大约阅读时间需要 14 分钟。
线性表是具有相同数据类型的n(n≥0)个数据元素的有限序列,其中n为表长。当n=0时,线性表是一个空表。
void InitList(List* L) { L->data = (int*)malloc(InitSize * sizeof(int)); L->length = 0; L->MaxSize = InitSize;} void DestroyList(List* L) { for (int i = 0; i < L->length; i++) { L->data[i] = 0; } L->length = 0;} 插入元素需将之后的元素从后往前移。
bool ListInsert(List* L, int n, int e) { if (n > L->length + 1) { return false; } for (int i = L->length; i > n; i--) { L->data[i] = L->data[i - 1]; } L->data[n - 1] = e; L->length++; return true;} 删除元素需将之后的元素从前往后移。
bool ListDelete(List* L, int n, int* e) { if (n < 0 || n > L->length + 1) { return false; } *e = L->data[n - 1]; for (int i = n - 1; i < L->length; i++) { L->data[i] = L->data[i + 1]; } L->length--; return true;} 按值查找函数需要遍历整个表。
int LocateElem(List* L, int n) { for (int i = 0; i < L->length; i++) { if (L->data[i] == n) { return i; } } return -1;} 使用静态数组实现,大小固定。
typedef struct SeqList { int data[MaxSize]; int length;} SeqList; 使用动态数组实现,支持扩展。
typedef struct SeqList { int* data; int MaxSize; int length;} SeqList; void InitList(SeqList* L) { L->data = (int*)malloc(InitSize * sizeof(int)); L->length = 0; L->MaxSize = InitSize;} void DestroyList(SeqList* L) { for (int i = 0; i < L->length; i++) { L->data[i] = 0; } L->length = 0;} bool ListInsert(SeqList* L, int n, int e) { if (n > L->length + 1) { return false; } for (int i = L->length; i > n; i--) { L->data[i] = L->data[i - 1]; } L->data[n - 1] = e; L->length++; return true;} bool ListDelete(SeqList* L, int n, int* e) { if (n < 0 || n > L->length + 1) { return false; } *e = L->data[n - 1]; for (int i = n - 1; i < L->length; i++) { L->data[i] = L->data[i + 1]; } L->length--; return true;} 按位查找函数直接访问数组元素。
int GetElem(SeqList* L, int n) { return L->data[n - 1];} typedef struct LNode { int data; struct LNode* next;} LNode, *LinkList; typedef struct LNode { int data; struct LNode* next;} LNode, *LinkList; bool ListInsert(LinkList L, int i, int e) { if (i < 1) { return false; } Node* p = L; int j = 0; while (p != NULL && j < i - 1) { p = p->next; j++; } if (p == NULL) { return false; } InsertNextNode(p, e); return true;}bool InsertNextNode(Node* p, int e) { Node* s = (Node*)malloc(sizeof(Node)); if (s == NULL) { return false; } s->data = e; s->next = p->next; p->next = s; return true;} bool ListDelete(LinkList L, int i, int* e) { if (i < 1) { return false; } Node* p = L; int j = 0; while (p != NULL && j < i - 1) { p = p->next; j++; } if (p == NULL) { return false; } DeleteNode(p); return true;}bool DeleteNode(Node* p) { Node* q = p->next; p->data = q->data; p->next = q->next; free(q); return true;} 按位查找:
Node* GetElem(LinkList L, int i) { if (i < 0) { return NULL; } Node* p = L; int j = 0; while (p != NULL && j < i) { p = p->next; j++; } return p;} 按值查找:
Node* LocateNode(LinkList L, int e) { Node* p = L->next; while (p != NULL && p->data != e) { p = p->next; } return p;} int Length(LinkList L) { Node* p = L->next; int len = 0; while (p != NULL) { p = p->next; len++; } return len;} void PrintList(LinkList L) { Node* p = L->next; while (p != NULL) { printf("%d ", p->data); p = p->next; }} 链表与顺序表各有优缺点,链表的插入删除操作较为灵活,但需处理指针操作的复杂性。顺序表支持随机访问,但插入删除操作效率较低。线性表是两者的基础,理解其操作对后续学习至关重要。
转载地址:http://sqef.baihongyu.com/