一、严蔚敏数据结构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;
}