《数据结构(C语言版)》严蔚敏代码实现———链表

一、前言

哈喽,大家好~我是熊子q,我又来了!
他来了他来了,他带着代码过来了!
今天要分享的代码是链表!快快搬着小板凳!

二、代码

严奶奶的书中预定义了一些预定义常量和类型,大家可以 新建一个y.h文件粘贴以下内容, 然后再去复制代码哦。

y.h文件内容:

/**
 * 严奶奶书中的预定义常量和类型
 **/
//函数结果状态代码
#define TRUE 1          //成功
#define FALSE 0         //失败
#define OK 1            //成功
#define ERROR 0         //错误
#define INFEASIBLE -1   //不可实行
#define OVERFLOW -2     //溢出
//Status 是函数的类型,其值是函数结果状态代码
typedef int Status;

链表LinkList.cpp:

#include "y.h"
#include <iostream>
#include <cstdlib>
#include <cstdio>
using namespace std;
typedef int ElemType;
/**
 * 严奶奶单链表的实现
 *  by 熊子q 2021.2.1
 **/
typedef struct LNode{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

//获取元素
Status GetElem(LinkList L, int i, ElemType &e){
    //L为带头结点的单链表的头指针
    //当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
    LNode *p = L->next;         //p指向第一个结点
    int j = 1;                  //j为计数器
    while(p && j<i){            //寻找第i个位置
        p = p->next;
        ++j;
    }
    if(!p || j>i) return ERROR; //第i个元素不存在
    e = p->data;                //否则获取第i个元素
    return OK;
}

//插入元素,时间复杂度O(n)
Status Insert(LinkList &L, int i, ElemType e){
    //在带头结点的单链表L中第i个位置之前插入元素e
    LNode *p = L;
    int j = 0;
    while(p && j<i-1){p = p->next;++j;}
    if(!p || j>i-1) return ERROR;       //i小于1或者大于表长加1
    LNode *q = (LNode*)malloc(sizeof(LNode));
    q->data = e;                        //插入数据
    q->next = p->next;
    p->next = q;
    return OK;
}

//删除元素,时间复杂度O(n)
Status ListDelete(LinkList &L, int i, ElemType e){
    //在带头结点的单链表L中,删除第i个元素,并由e返回其值
    LNode *p = L->next;
    int j = 1;
    while(p && j<i-1){p = p->next;++j;}     //寻找i的前驱元素
    if(!(p->next) || j>i-1) return ERROR;   //删除位置不合理,i元素不存在或
    LNode *q = p->next;                     //删除第i个位置元素,并释放该结点
    p->next = q->next;
    e = q->data;
    free(q);
    return OK;
}

//创建链表
void CreateList(LinkList &L, int n){
    //逆序输入n个元素的值,建立带头结点的单链表L
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;                 //建立一个头结点
    printf("请输入数据:\n");
    for(int i=n;i>0;--i){
        LNode *p = (LNode*)malloc(sizeof(LNode));
        scanf("%d",&(p->data));
        p->next = L->next; L->next = p;
    }

}

//合并两个有序链表
void MergeList(LinkList &La, LinkList &Lb, LinkList &Lc){
    //已知单链表La和Lb的元素按值非递减排列
    //归并La和Lb得到新的单链表Lc,Lc的元素也按值非递减排列
    LNode *pa = La->next;
    LNode *pb = Lb->next;
    LNode *pc = La;         //用La的头结点作为Lc的头结点
    Lc = pc;
    while(pa && pb){
        //取二者中较大值添加到Lc中
        if(pa->data > pb->data){
            //先添加该节点为pc的后继元素,然后pc和pa指针都后移
            pc->next = pa; pc = pc->next; pa = pa->next;
        }
        else{pc->next = pb; pc = pc->next; pb = pb->next;}
    }
    pc->next = pa? pa: pb;      //插入剩余段
    free(Lb);                   //释放Lb的头结点
}

//输出单链表
void Display(LinkList &L){
    LNode *p = L->next;
    printf("单链表的内容为:");
    while(p){
        printf("%d",p->data);
        if(p->next) printf("->");
        else printf("\n");
        p = p->next;
    }
}

int main(){
    LinkList l;
    CreateList(l, 5);
    Display(l);
    // printf("在第%d位插入%d",1,123);
    // Insert(l, 1, 123);
    // Display(l);
    int tmp;
    GetElem(l, 2, tmp);
    printf("%d",tmp);
    return 0;
}

三、运行截图

四、附录

如果你想看其他的代码,下面有链接哦:

posted @ 2021-02-01 21:20  熊子q  阅读(624)  评论(0编辑  收藏  举报