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

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

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

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

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

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

  1. 初始化线性表

LNode* L;
L = (Linklist)malloc(sizeof(struct Node));
L->next = NULL;
  1. 查找操作

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

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
#include
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;
}

最终运行效果:

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

你可能感兴趣的:(数据结构,数据结构,链表)