6-62 单链表基本运算算法的实现

线性表实验二 实现单链表各种基本运算的算法

目的: 领会单链表存储结构和掌握单链表中各种基本运算算法设计。

内容: 实现单链表的各种基本运算(假设单链表的元素类型ElemType为char),并在此基础上设计一个程序,完成如下功能:

(1)初始化单链表h。

(2)依次采用尾插法插入a、b、c、d、e元素。

(3)输出单链表h。

(4)输出单链表h长度。

(5)判断单链表h是否为空。

(6)输出单链表h的第3个元素。

(7)输出元素a的位置。

(8)在第4个元素位置上插入f元素。

(9)输出单链表h。

(10)删除单链表h的第3个元素。

(11)输出单链表h。

(12)释放单链表h。

单链表结点类型定义:

 

typedef char ElemType;

typedef struct LNode {

ElemType data; struct LNode *next; //指向后继结点

} LinkNode; //单链表结点类型

函数接口定义:

下列各函数签名中,L为带头结点的单链表的头指针,如下图所示:

带头结点的单链表.png

 


/**
 * 头插法建立单链表
 */
void CreateListF(LinkNode *&L, ElemType a[], int n);

/**
 * 尾插法建立单链表
 */
void CreateListR(LinkNode *&L, ElemType a[], int n);

/**
 * 初始化线性表
 */
void InitList(LinkNode *&L);

/**
 * 销毁线性表
 */
void DestroyList(LinkNode *&L);

/**
 * 判线性表是否为空表。空表返回true,否则返回false。
 */
bool ListEmpty(LinkNode *L);

/**
 * 求线性表的长度
 */
int ListLength(LinkNode *L);

/**
 * 输出线性表: 每个数据后面一个空格
 */
void DispList(LinkNode *L);

/**
 * 求线性表中第i个元素值。
 * 存在第i个数据结点,其值存入e,然后返回true。
 * 不存在第i个数据结点,返回false。
 */
bool GetElem(LinkNode *L, int i, ElemType &e);

/**
 * 查找第一个值域为e的元素序号。
 * 若存在,返回其逻辑序号;若不存在,返回0。
 */
int LocateElem(LinkNode *L, ElemType e);

/**
 * 插入第i个元素。
 * 插入成功,返回true;插入不成功,返回false。
 */
bool ListInsert(LinkNode *&L, int i, ElemType e);

/**
 * 删除第i个元素。
 * 如果第i个元素存在,其值存入e,返回true;
 * 如果第i个元素不存在,返回false。
 */
bool ListDelete(LinkNode *&L, int i, ElemType &e);

 

裁判测试程序样例:

 

#include <stdio.h>
#include <stdlib.h>

typedef char ElemType;

typedef struct LNode {
    ElemType data;
    struct LNode *next;        //指向后继结点
} LinkNode;                     //单链表结点类型

/**
 * 头插法建立单链表
 */
void CreateListF(LinkNode *&L, ElemType a[], int n);

/**
 * 尾插法建立单链表
 */
void CreateListR(LinkNode *&L, ElemType a[], int n);

/**
 * 初始化线性表
 */
void InitList(LinkNode *&L);

/**
 * 销毁线性表
 */
void DestroyList(LinkNode *&L);

/**
 * 判线性表是否为空表。空表返回true,否则返回false。
 */
bool ListEmpty(LinkNode *L);

/**
 * 求线性表的长度
 */
int ListLength(LinkNode *L);

/**
 * 输出线性表: 每个数据后面一个空格
 */
void DispList(LinkNode *L);

/**
 * 求线性表中第i个元素值。
 * 存在第i个数据结点,其值存入e,然后返回true。
 * 不存在第i个数据结点,返回false。
 */
bool GetElem(LinkNode *L, int i, ElemType &e);

/**
 * 查找第一个值域为e的元素序号。
 * 若存在,返回其逻辑序号;若不存在,返回0。
 */
int LocateElem(LinkNode *L, ElemType e);

/**
 * 插入第i个元素。
 * 插入成功,返回true;插入不成功,返回false。
 */
bool ListInsert(LinkNode *&L, int i, ElemType e);

/**
 * 删除第i个元素。
 * 如果第i个元素存在,其值存入e,返回true;
 * 如果第i个元素不存在,返回false。
 */
bool ListDelete(LinkNode *&L, int i, ElemType &e) ;

int main() {
    LinkNode *h;
    ElemType e;
    printf("单链表的基本运算如下:\n");
    printf("  (1)初始化单链表h\n");
    InitList(h);
    printf("  (2)依次采用尾插法插入a,b,c,d,e元素\n");
    ListInsert(h, 1, 'a');
    ListInsert(h, 2, 'b');
    ListInsert(h, 3, 'c');
    ListInsert(h, 4, 'd');
    ListInsert(h, 5, 'e');
    printf("  (3)输出单链表h:");
    DispList(h);
    printf("  (4)单链表h长度:%d\n", ListLength(h));
    printf("  (5)单链表h为%s\n", (ListEmpty(h) ? "空" : "非空"));
    GetElem(h, 3, e);
    printf("  (6)单链表h的第3个元素:%c\n", e);
    printf("  (7)元素a的位置:%d\n", LocateElem(h, 'a'));
    printf("  (8)在第4个元素位置上插入f元素\n");
    ListInsert(h, 4, 'f');
    printf("  (9)输出单链表h:");
    DispList(h);
    printf("  (10)删除h的第3个元素\n");
    ListDelete(h, 3, e);
    printf("  (11)输出单链表h:");
    DispList(h);
    printf("  (12)释放单链表h\n");
    DestroyList(h);
    return 0;
}

/* 请在下面填写代码 */
 

输入样例:

参见题目功能说明。

 

输出样例:

参见题目功能说明。
整体输出线性表时,每个数据后面一个空格。

单链表的基本运算如下:
  (1)初始化单链表h
  (2)依次采用尾插法插入a,b,c,d,e元素
  (3)输出单链表h:a b c d e 
  (4)单链表h长度:5
  (5)单链表h为非空
  (6)单链表h的第3个元素:c
  (7)元素a的位置:1
  (8)在第4个元素位置上插入f元素
  (9)输出单链表h:a b c f d e 
  (10)删除h的第3个元素
  (11)输出单链表h:a b f d e 
  (12)释放单链表h

 

解题 


/**
 * 头插法建立单链表
 */
void CreateListF(LinkNode *&L, ElemType a[], int n){ 
    InitList(L);
     for(int i = 0; i < n; i++){
         LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
         s->data = a[i];
         s->next = L->next;
         L->next = s;
     }
}

/**
 * 尾插法建立单链表
 */
void CreateListR(LinkNode *&L, ElemType a[], int n){
    InitList(L);
    LinkNode *r = L;
    for(int i = 0; i < n; i++){
        LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
        s->data = a[i];
        s->next = r->next;
        r->next = s;
        r=s;
    }
}

/**
 * 初始化线性表
 */
void InitList(LinkNode *&L){
    L = (LinkNode *)malloc(sizeof(LinkNode));
    L->next = NULL;
}

/**
 * 销毁线性表
 */
void DestroyList(LinkNode *&L){
    LinkNode *pre = L, *p = L->next;
    while(p != NULL){
        free(pre);
        pre = p;
        p = pre->next;
    }
    free(pre);
}

/**
 * 判线性表是否为空表。空表返回true,否则返回false。
 */
bool ListEmpty(LinkNode *L){
    if(L->next == NULL){
        return true;
    }else{
        return false;
    }
}

/**
 * 求线性表的长度
 */
int ListLength(LinkNode *L){
    int j=0;
    LinkNode *p = L;
    while(p->next != NULL){
        p = p->next;
        j++;
    }
    return j;
}

/**
 * 输出线性表: 每个数据后面一个空格
 */
void DispList(LinkNode *L){
    LinkNode *p = L->next;
    while(p != NULL){
        printf("%c ", p->data);
        p = p->next;
    }
    printf("\n");
}

/**
 * 求线性表中第i个元素值。
 * 存在第i个数据结点,其值存入e,然后返回true。
 * 不存在第i个数据结点,返回false。
 */
bool GetElem(LinkNode *L, int i, ElemType &e){
    LinkNode *p = L;
    int j = 0;
    while(j != i && p != NULL){
        p = p->next;
        j++;
    }
    if(p == NULL){
        return false;
    }else{
        e = p->data;
        return true;
    }
}

/**
 * 查找第一个值域为e的元素序号。
 * 若存在,返回其逻辑序号;若不存在,返回0。
 */
int LocateElem(LinkNode *L, ElemType e){
    LinkNode *p = L;
    int j = 0;
    while(p != NULL){
        p = p->next;
        j++;
        if(p->data == e){
            return j;
        }
    }
    return 0;
}

/**
 * 插入第i个元素。
 * 插入成功,返回true;插入不成功,返回false。
 */
bool ListInsert(LinkNode *&L, int i, ElemType e){
    int j = 0;
    LinkNode *p = L, *s;
    if (i <= 0) return false;
    while(j < i-1 &&p != NULL){
        j++;
        p = p->next;
        
    }
    if(p == NULL){
            return false;
        }else{
            s = (LinkNode *)malloc(sizeof(LinkNode));
            s->data = e;
            s->next = p->next;
            p->next = s;
            return true;
        }
}

/**
 * 删除第i个元素。
 * 如果第i个元素存在,其值存入e,返回true;
 * 如果第i个元素不存在,返回false。
 */
bool ListDelete(LinkNode *&L, int i, ElemType &e){
    if(i < 1) return false;
    int j = 1;
    LinkNode *pre ,*p = L->next;
    while(p != NULL){
        p = p->next;
        j++;
        if(j == i){
            pre = p;
            e = p->data;
            p = p->next;
            pre->data = p->data;
            pre->next = p->next;
            free(p);
            return true;
        }
    }
    return false;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值