100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 严蔚敏数据结构C语言版——线性表的链式存储方式详细代码

严蔚敏数据结构C语言版——线性表的链式存储方式详细代码

时间:2022-03-05 19:11:49

相关推荐

严蔚敏数据结构C语言版——线性表的链式存储方式详细代码

一、严蔚敏数据结构C语言版

由于书上的许多地方都是伪代码,所以下面的代码对课本上的做了一些改动,使代码能够正常运行

链表的定义即相关类型定义

typedef int ElementType;typedef struct Node {ElementType data;struct Node* next;}LNode, * Linklist;

这里采用两种类型来定义这个结构体,一个是直接定义,另一个是使用结构体指针的方式来定义

初始化线性表

LNode* L;L = (Linklist)malloc(sizeof(struct Node));L->next = NULL;

查找操作

在链式存储结构中,查找这一操作只能从头结点开始做,因为单链表中的结点只能从前一个找到后一个,而不能由后一个找到前一个,这一操作在单链表中有十分重要的应用,在后面的删除和查找中都有用到

void Get_elem(Linklist L, int i, ElementType& e){if (!L)return;if (i < 1)return;Linklist p = L->next;int j = 1;while (p && j < i){p = p->next;j++;}if (!p || j > i)return;e = p->data;}

4.插入操作

void Insert(Linklist& L, int i, ElementType e){if (!L)return;if (i < 1)return;Linklist p = L;int j = 0;while (p->next && j < i - 1){p = p->next;j++;}if (!p || j > i - 1)return;Linklist s = (Linklist)malloc(sizeof(struct Node));s->data = e;s->next = p->next;p->next = s;}

5.删除操作

void Delete(Linklist& L, int i, ElementType& e){if (!L)return;if (i < 1)return;Linklist p = L;int j = 0;while (p->next && j < i - 1){p = p->next;j++;}if (!p || j > i - 1)return;Linklist q = p->next;e = q->data;p->next = q->next;free(q);}

6.清空操作

void Empty(Linklist& L){if (!L)return;Linklist L2 = L->next;while (L2){Linklist p = L2;L2 = L2->next;free(p);}L->next = NULL;}

7.销毁操作

bool Destroy(Linklist& L){if (!L)return false;while (L){Linklist p = L;L = L->next;free(p);}return true;}

8.合并两个已经排好序的单链表

Linklist Merge_list(Linklist L1, Linklist L2){Linklist L;L = (Linklist)malloc(sizeof(struct Node));L->next = NULL;int t = 0;while (L1 && L2){if (L1->data <= L2->data){Insert(L, t++, L1->data);L1 = L1->next;}else{Insert(L, t++, L2->data);L2 = L2->next;}}while (L1){Insert(L, t++, L1->data);L1 = L1->next;}while (L2){Insert(L, t++, L2->data);L2 = L2->next;}return L->next;}

9.打印单链表(不含头结点):

void print(Linklist L){if (!L) return;LNode* p = L->next;int i = 1;while (p != NULL){printf("%d ", p->data);if (i % 10 == 0)puts("");i++;p = p->next;}}

总代码如下(学号是自己瞎编的,为了使它更像学号而已):

#include<stdio.h>#include<stdlib.h>typedef int ElementType;typedef int Status;typedef struct Node {ElementType data;struct Node* next;}LNode,*Linklist;void print(Linklist L);Linklist Merge_list(Linklist L1, Linklist L2);void Get_elem(Linklist L, int i, ElementType& e);void Insert(Linklist& L, int i, ElementType e);void Delete(Linklist& L, int i, ElementType& e);void Empty(Linklist& L);bool Destroy(Linklist& L);int main(){ElementType e = 0;Linklist L1;Linklist L2;Linklist L;L1 = (Linklist)malloc(sizeof(struct Node));L2 = (Linklist)malloc(sizeof(struct Node));L = (Linklist)malloc(sizeof(struct Node));L1->next = NULL;L2->next = NULL;L->next = NULL;int t = 0;printf("将偶数学号放入L1中:\n");for (int i = 19422102; i <= 19422130; i += 2)Insert(L1, ++t, i);print(L1); puts("");printf("\n将奇数学号放入L2中:\n");for (int i = 19422129; i >= 19422101; i-=2)Insert(L2, 1, i);print(L2); puts("");printf("\n将两个单链表里的元素按照从小到大的顺序插入到L中:\n");L = Merge_list(L1, L2);print(L); puts("");Linklist p = L;printf("将学号最后两位数不是三的倍数的学号去掉:\n");for (int i = 29; i; i--){if (i % 3){Delete(L, i, e);printf("%d ", e);}if (i % 10 == 0)puts("");}puts("");printf("\n输出学号尾数是3的倍数的学号:\n");print(L);Destroy(L1);Destroy(L2);Destroy(L);return 0;}void print(Linklist L){if (!L) return;LNode* p = L->next;int i = 1;while (p != NULL){printf("%d ", p->data);if (i % 10 == 0)puts("");i++;p = p->next;}}Linklist Merge_list(Linklist L1, Linklist L2){Linklist L;L = (Linklist)malloc(sizeof(struct Node));L->next = NULL;int t = 0;while (L1 && L2){if (L1->data <= L2->data){Insert(L, t++, L1->data);L1 = L1->next;}else{Insert(L, t++, L2->data);L2 = L2->next;}}while (L1){Insert(L, t++, L1->data);L1 = L1->next;}while (L2){Insert(L, t++, L2->data);L2 = L2->next;}return L->next;}void Get_elem(Linklist L, int i, ElementType& e){if (!L)return;if (i < 1)return;Linklist p = L->next;int j = 0;while (p && j < i){p = p->next;j++;}if (!p || j > i)return;e = p->data;}void Insert(Linklist& L, int i, ElementType e){if (!L)return;if (i < 1)return;Linklist p = L;int j = 0;while (p->next && j < i - 1){p = p->next;j++;}if (!p || j > i - 1)return;Linklist s = (Linklist)malloc(sizeof(struct Node));s->data = e;s->next = p->next;p->next = s;}void Delete(Linklist& L, int i, ElementType& e){if (!L)return;if (i < 1)return;Linklist p = L;int j = 0;while (p->next && j < i - 1){p = p->next;j++;}if (!p || j > i - 1)return;Linklist q = p->next;e = q->data;p->next = q->next;free(q);}void Empty(Linklist& L){if (!L)return;Linklist L2 = L->next;while (L2){Linklist p = L2;L2 = L2->next;free(p);}L->next = NULL;}bool Destroy(Linklist& L){if (!L)return false;while (L){Linklist p = L;L = L->next;free(p);}return true;}

最终运行效果:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。