首页 > 编程知识 正文

数据结构c语言版线性表,数据结构王红梅从概念到c实现

时间:2023-05-04 17:29:43 阅读:159893 作者:4142

@说明: 本代码对应《数据结构(C语言版)严蔚敏》第二章第三节中抽象数据类型线性链表的实现。 本代码分为三个文件:LinkList.h定义着线性链表抽象数据对象与基本操作;LinkList.cpp是对LinkList.h头文件中基本操作的具体实现;TestMain.cpp是一部分对线性链表实现过程的测试。 1:LinkList.h文件 #include<stdio.h>#define MAXSIZE 20#define TRUE 1#define FALSE 0typedef int Status;typedef int ElemType;//定义元素的类型typedef struct LNode {ElemType data;struct LNode *next;}LNode,LinkList;//初始化一个空的线性表,使其长度为0Status InitLinkList(LinkList *L);//销毁线性表Status DestroyLinkList(LinkList *L);//添加一个元素e到线性表中Status AddElem(LinkList *L, ElemType e);//重置线性表,使其长度为0,data从新分配内存Status ClearList(LinkList *L);//返回线性表的长度Status ListLength(LinkList L);//返回当前位子元素Status GetElem(LinkList L, int index, ElemType &e);//归并两个线性表Status MargeList(LinkList *La, LinkList *Lb, LinkList &Lc);//定位元素所在位子//该节中未实现Status Compare(ElemType e, ElemType data);Status LocationElem(LinkList *L, ElemType e, Status(Compare)(ElemType, ElemType));//在index上插入一个eStatus Insert(LinkList *L, int index, ElemType e);//在index上删除一个eStatus Delete(LinkList *L, int index, ElemType &del_e);//定义一个打印函数void PrintElem(ElemType e);//使线性表中的每个元素通过PrintElem函数打印出来Status LinkListTraverse(LinkList *L, void(Visit)(ElemType)); 2:LinkList.cpp #include<stdio.h>#include <string.h>#include<stdlib.h>#include"LinkList.h"Status InitLinkList(LinkList *L) {if (L == NULL) {printf("111111111111");L = (LinkList *)malloc(sizeof(LinkList));}if (L == NULL) {printf("内存分配失败!");return FALSE;}else {L->data = NULL;L->next = NULL;LinkList *p, *q=L;int x;printf("输入你要添加结点的个数:");scanf_s("%d", &x);while (x > 0) {p = (LinkList *)malloc(sizeof(LinkList));printf("请输入链表结点的值!n");scanf_s("%d", &p->data);while (q->next != NULL) {q = q->next;}p->next = q->next;q->next = p;x--;}return TRUE;}}Status DestroyLinkList(LinkList *L) {if (L != NULL) {LinkList *p,*q;for (p = L->next; p != NULL; p = q) {q = p->next;free(p);}L->next = NULL;return TRUE; }return FALSE;}Status AddElem(LinkList *L, ElemType e) {if (L != NULL) {LinkList *p = L;while (p->next != NULL) {p = p->next;}LinkList* e_Node = (LNode *)malloc(sizeof(LNode));//声请一个节点空间e_Node->data = e;e_Node->next = NULL;p->next = e_Node;return TRUE;}return FALSE;}Status ClearList(LinkList *L) {if (L == NULL) {printf("The list is empty, no need to clear.n");return 0;}LinkList *p = L->next, *q = NULL;while (p != NULL){q = p->next;free(p);p = q;}L->next = NULL;free(q);printf("The list is cleared.n");return TRUE;}Status ListLength(LinkList L) {LinkList *p = L.next;int length = 0;while (p != NULL) {p = p->next;length++;}return length;}Status GetElem(LinkList L, int index, ElemType &e) {LinkList *p = L.next;int j = 0;while (p != NULL && j < index) {p = p->next;j++;}if (p == NULL || j > index) return FALSE;e = p->data;return TRUE;}Status MargeList(LinkList *La, LinkList *Lb, LinkList &Lc) {LinkList *pa = La->next,*pb = Lb->next, *pc=&Lc;while (pa && pb) {if (pa->data <= pb->data) {pc->next = pa;pc = pa;pa = pa->next;}else {pc->next = pb;pc = pb;pb = pb->next;}}pc->next = pa ? pa : pb;return TRUE;}Status Insert(LinkList *L, int index, ElemType e) {LinkList *p = L;int j = 0;while (p != NULL && j < index-1) {p = p->next;j++;}if (p==NULL && j > index) return FALSE;LNode *e_Elen = (LNode *)malloc(sizeof(LNode));e_Elen->data = e;e_Elen->next = p->next;p->next = e_Elen;return TRUE;}Status Delete(LinkList *L, int index, ElemType &del_e) {LinkList *p = L->next, *preNode = L;printf("L->next = %d n",L->next->data);int n = 1;while (p != NULL && n < index) {preNode = p;p = p->next;n++;}if (p == NULL || n > index) return FALSE;del_e = p->data;preNode->next = p->next;free(p);return TRUE;}//定义一个打印一个数值的函数void PrintElem(ElemType e){printf("%d ", e);}void PrintElem(char e[10]){printf("%s ", e);}//使线性表中的每个元素通过PrintElem函数打印出来Status LinkListTraverse(LinkList *L, void(Visit)(ElemType)) {if (L != NULL) {LinkList *p;for (p = L->next; p != NULL; p = p->next)//调用打印函数Visit(p->data);printf("n");return TRUE;}return FALSE;} 3:TestMain.cpp #include<stdio.h>#include<string.h>#include"LinkList.h"int main() {LinkList La;InitLinkList(&La);LinkListTraverse(&La, PrintElem);LinkList Lb;InitLinkList(&Lb);LinkListTraverse(&Lb, PrintElem);LinkList Lc;MargeList(&La, &Lb, Lc);LinkListTraverse(&Lc, PrintElem);//ClearList(&L);//清空表//LinkListTraverse(&Lb, PrintElem);ElemType d;//GetElem(L, 3, d);//PrintElem(d);Insert(&L, 6, 9);LinkListTraverse(&L, PrintElem);printf("长度%dn", ListLength(L));printf("删除第6的值");Delete(&L, 1, d);PrintElem(d);DestroyLinkList(&L);LinkListTraverse(&L, PrintElem);return 0;} 4:结果

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。