一、目的 1. 领会顺序表存储结构和掌握顺序表中各种基本运算算法设计; 2. 领会单链表存储结构和掌握单链表中各种基本运算算法设计。
二、内容 1.编写一个程序sqlist.c,实现顺序表的各种基本运算和整体建表算法(假设顺序表的元素类型ElemType为char),并在此基础上设计一个主程序,完成如下功能: (1)初始化顺序表L (2)依次插入a,b,c,d,e元素 (3)输出顺序表L (4)顺序表L长度 (5)判断顺序表L是否为空 (6)输出顺序表L的第3个元素 (7)输出元素a的位置 (8)在第4个元素位置上插入f元素 (9)输出顺序表L (10)删除L的第3个元素 (11)输出顺序表L (12)释放顺序表L 2.编写一个程序linklist.c,实现单链表的各种基本运算和整体建表算法(假设单链表的元素类型ElemType为char),并在此基础上设计一个主程序,完成如下功能: (1)初始化单链表L (2)依次插入a,b,c,d,e元素 (3)输出单链表L (4)单链表L长度 (5)判断单链表L是否为空 (6)输出单链表L的第3个元素 (7)输出元素a的位置 (8)在第4个元素位置上插入f元素 (9)输出单链表L (10)删除L的第3个元素 (11)输出单链表L (12)释放单链表L
三、源代码 1.基本顺序表
#include<stdio.h> #include<malloc.h> #include<stdlib.h> #define MaxSize 50 typedef char ElemType; typedef struct { ElemType data[MaxSize]; int length; }SqList; void CreatList(SqList **L, ElemType a[], int n) { *L = (SqList*)malloc(sizeof(SqList)); for (int 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) { for (int i = 0; i < L->length; i++) { printf("%c", L->data[i]); } printf("\n"); } 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; } int main() { SqList *L; ElemType e; printf("顺序表的基本运算如下:\n"); printf("(1)初始化顺序表L\n"); InitList(&L); printf("(2)依次插入a,b,c,d,e元素\n"); ListInsert(&L, 1, 'a'); ListInsert(&L, 2, 'b'); ListInsert(&L, 3, 'c'); ListInsert(&L, 4, 'd'); ListInsert(&L, 5, 'e'); printf("(3)输出顺序表L:"); DispList(L); printf("(4)顺序表L长度:%d\n", ListLength(L)); printf("(5)顺序表L为%s\n", (ListEmpty(L) ? "空" : "非空")); GetElem(L, 3, &e); printf("(6)顺序表L的第3个元素:%c\n", e); printf("(7)元素a的位置:%d\n", LocateElem(L, 'a')); printf("(8)在第4个元素位置上插入f元素\n"); ListInsert(&L, 4, 'f'); printf("(9)输出顺序表L:"); DispList(L); printf("(10)删除L的第3个元素\n"); ListDelete(&L, 3, &e); printf("(11)输出顺序表L:"); DispList(L); printf("(12)释放顺序表L\n"); DestroyList(&L); system("pause"); return 1; }2.基本单链表
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef char ElemType; typedef struct LNode { ElemType data; struct LNode *next; }LinkNode; void CreateListF(LinkNode **L, ElemType a[], int n) { LinkNode *s; (*L) = (LinkNode *)malloc(sizeof(LinkNode)); (*L)->next = NULL; for (int i = 0; i < n; i++) { s = (LinkNode *)malloc(sizeof(LinkNode)); s->data = a[i]; s->next = (*L)->next; (*L)->next = s; } } void CreateListR(LinkNode **L, ElemType a[], int n) { LinkNode *s, *r; (*L) = (LinkNode *)malloc(sizeof(LinkNode)); r = *L; for (int i = 0; i < n; i++) { s = (LinkNode *)malloc(sizeof(LinkNode)); s->data = a[i]; r->next = s; r = s; } r->next = NULL; } void InitList(LinkNode **L) { (*L) = (LinkNode *)malloc(sizeof(LinkNode)); (*L)->next = NULL; } void DestroyList(LinkNode **L) { LinkNode *pre = *L, *p = (*L)->next; while (p != NULL) { free(pre); pre = p; p = p->next; } free(p); } int ListEmpty(LinkNode *L) { return(L->next == NULL); } int ListLength(LinkNode *L) { int i = 0; LinkNode *p = L; while (p->next != NULL) { i++; p = p->next; } return(i); } void DispList(LinkNode *L) { LinkNode *p = L->next; while (p != NULL) { printf("%c ", p->data); p = p->next; } printf("\n"); } int GetElem(LinkNode *L, int i, ElemType *e) { int j = 0; LinkNode *p = L; if (i <= 0)return 0; while (j < i&&p != NULL) { j++; p = p->next; } if (p == NULL) return 0; else { *e = p->data; return 1; } } int LocateElem(LinkNode *L, ElemType e) { int i = 1; LinkNode *p = L->next; while (p != NULL && p->data != e) { i++; p = p->next; } if (p == NULL) return 0; else return i; } int ListInsert(LinkNode **L, int i, ElemType e) { LinkNode *p = *L, *s; int j = 0; if (i <= 0)return 0; while (j < i - 1 && p != NULL) { j++; p = p->next; } if (p == NULL) return 0; else { s = (LinkNode *)malloc(sizeof(LinkNode)); s->data = e; s->next = p->next; p->next = s; return 1; } } int ListDelete(LinkNode **L, int i, ElemType *e) { LinkNode *p = *L, *q; int j = 0; if (i <= 0)return 0; while (j < i - 1 && p != NULL) { j++; p = p->next; } if (p == NULL) return 0; else { q = p->next; if (q == NULL) return 0; *e = p->next->data; p->next = q->next; free(q); return 1; } } int main() { LinkNode *h; ElemType e; printf("单链表的基本运算如下:\n"); printf(" (1)初始化单链表h\n"); InitList(&h); printf(" (2)依次插入a、b、c、d、e元素\n"); ListInsert(&h, 1, 'a'); ListInsert(&h, 2, 'b'); ListInsert(&h, 3, 'c'); ListInsert(&h, 4, 'd'); ListInsert(&h, 5, 'e'); printf(" (3)输出单链表h:"); DispList(h); printf(" (4)单链表h长度:%d\n", ListLength(h)); printf(" (5)单链表h为%s\n", (ListEmpty(h) ? "空" : "非空")); GetElem(h, 3, &e); printf(" (6)单链表h的第3个元素:%c\n", e); printf(" (7)元素a的位置:%d\n", LocateElem(h, 'a')); printf(" (8)在第4个元素位置上插入f元素\n"); ListInsert(&h, 4, 'f'); printf(" (9)输出单链表h:"); DispList(h); printf(" (10)删除h的第3个元素\n"); ListDelete(&h, 3, &e); printf(" (11)出单链表h:"); DispList(h); printf(" (12)释放单链表h\n"); DestroyList(&h); system("pause"); return 0; }备注: 有问题可以评论,看到后我会尽力及时回复的,谢谢!