3/6/24单链表头插法、尾插法实现、按值、按位置查找

 理清解题逻辑,实现代码时注意不要跳跃思考,出现细节错误将导致程序不符合题解。

 OJ练习

顺序表添加删除元素

初始化顺序表(顺序表中元素为整型),里边的元素是1,2,3,然后读取一个元素(假如插入的是6),插入到第2个位置,打印输出顺序表,每个元素占3个空格,格式为1  6  2  3。然后scanf读取一个整型数,是删除的位置(假如输入为1),然后输出顺序表  6  2  3,假如输入的位置不合法,输出false字符串。

#include <stdio.h>

#define MaxSize 100
typedef int ElemType;
typedef struct {
    ElemType data[MaxSize];
    int length;
} SqList;

void InsertList(SqList &L, ElemType element) {
    for (int i = L.length; i >= 2; i--) {
        L.data[i] = L.data[i - 1];
    }
    L.data[1] = element;
    L.length++;
}

bool DeleteList(SqList &L, int i) {
    if (i < 0 || i > L.length) return false;
    for (int j = i; j <= L.length; j++) {
        L.data[j - 1] = L.data[j];
    }
    L.length--;
    return true;
}


void PrintList(SqList L) {
    for (int i = 0; i < L.length; i++) {
        printf("%3d", L.data[i]);
    }
    printf("\n");
}

int main() {
    SqList L;
    L.data[0] = 1;
    L.data[1] = 2;
    L.data[2] = 3;
    L.length = 3;
    ElemType inElem;
    scanf("%d", &inElem);
    InsertList(L, inElem);
    PrintList(L);
    ElemType delElem;
    scanf("%d", &delElem);
    if (DeleteList(L, delElem))PrintList(L);
    else printf("false");
    return 0;
}

链表头插法尾插法实现

typedef int ElemType;
typedef struct LNode {
    ElemType data;//数据域
    struct LNode *next;
} LNode, *LinkList;

//LNode*是结构体指针,和LinkList完全等价
void ListHeadInsert(LNode *&L) {
    L = (LinkList) malloc(sizeof(LNode));//申请头结点空间,头指针指向头结点
    L->next = NULL;
    ElemType x;
    scanf("%d", &x);
    LNode *s;//用来指向申请的新结点的指针
    while (x != 9999) {
        s = (LinkList) malloc(sizeof(LNode));
        s->data = x;
        s->next = L->next;//s的next指向原本的第一个数据结点
        L->next = s;//头指针L的next指向新的结点,使其成为第一个数据节点
        scanf("%d", &x);
    }
}
//尾插法新建链表
void ListTailInsert(LNode *&L) {
    L = (LinkList) malloc(sizeof(LNode));//申请头结点,头指针指向头结点
    L->next = NULL;
    ElemType x;
    scanf("%d", &x);
    LNode *r = L, *s;//r始终指向链表尾部,s用来指向申请的新结点
    while (x != 9999) {
        s = (LinkList) malloc(sizeof(LNode));//为新结点申请空间
        s->data = x;
        r->next = s;//新结点给尾结点的next指针
        r = s;//r指向新的尾部
        scanf("%d",&x);
    }
    r->next = NULL;//让尾结点的next指向NULL
}

 链表查找

//按位置查找
LinkList GetElem(LinkList L, int SearchPos) {
    int i = 0;
    if (SearchPos < 0)return NULL;
    while (L && i < SearchPos) {
        L = L->next;
        i++;
    }
    return L;
}
//按值查找
LinkList LocateElem(LinkList L, ElemType SearchVal) {
    while (L) {
        if (L->data == SearchVal) {
            return L;
        }
        L = L->next;
    }
    return NULL;

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值