带头结点单链表的基本操作-C实现

用了引用类型 "LinkList &L " 文件是.cpp结尾

LinkList.cpp

//单链表的基本操作(带头结点)

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

typedef int ElemType;


//结点定义
typedef struct LNode {
    ElemType data;       //数据域
    struct LNode *next;  //指针域
} LNode, *LinkList;        //LNode是struct LNode的别称,表示结点类型;LinkList是结点指针类型


//1.头插法建立单链表
//LinkList表示返回指针类型,也就是头指针指向的单链表
LinkList List_HeadInsert(LinkList &L) {

    L = (LinkList) malloc(sizeof(LNode)); //创建头结点
    L->next = NULL;

    LNode *s;  //新结点指针s

    int data;
    printf("头插法.请输入结点值:");  //以999输入为结束标志
    scanf("%d", &data);

    while (data != 999) {
        s = (LNode *) malloc(sizeof(LNode)); //创建结点,s指向新结点
        s->data = data;
        s->next = L->next;
        L->next = s;
        scanf("%d", &data);
    }
    return L; //返回指针L(所指向的单链表)

}

//2.尾插法建立单链表
LinkList List_TailList(LinkList &L) {

    L = (LinkList) malloc(sizeof(LNode));
    L->next = NULL;

    LNode *s;  //新结点指针s
    LNode *r = L;   //尾指针r

    int data;
    printf("尾插法.请输入结点值:");  //以999输入为结束标志
    scanf("%d", &data);
    while (data != 999) {
        s = (LNode *) malloc(sizeof(LNode));
        s->data = data;
        r->next = s;
        r = s;
        r->next = NULL;
        scanf("%d", &data);
    }
    return L;
}

//3.求表长
int List_Length(LinkList &L) {
    int i = 0;
    LNode *p = L;
    while (p->next != NULL) {
        p = p->next;
        i++;
    }
    return i;
}

//4.打印单链表
void PrintLinkList(LinkList &L) {
    LNode *p = L;
    if (p->next == NULL) {
        printf("该表为空!\n");
    }
    while (p->next != NULL) {
        printf("%d ", p->next->data);
        p = p->next;
    }
    printf("\n");

}

//5.按序号第i个查找结点
LNode *GetElem(LinkList &L, int i) {
    if (i < 1 || List_Length(L)==0) {        //判断i是否非法 或 链表是否为空
        return NULL;
    }

    int j = 1;  //计数
    LNode *p = L->next; //p从首元结点开始
    while (p != NULL && j < i) {
        p = p->next;
        j++;
    }
    return p;

}

//6.按值data查找结点
LNode *LocateElem(LinkList &L, int data) {

    if (L->next == NULL) {  //判空
        return NULL;
    }

    LNode *p = L->next;

    while (p != NULL) {
        if (p->data == data) {
            return p;
        }
        p = p->next;
    }
    return p;

}

//7.插入结点操作,第i个位置插入data
LinkList List_Insert(LinkList &L, int i, int data) {


    if (GetElem(L, i - 1) != NULL) { //有效位置判断

        LNode *s = (LNode *) malloc(sizeof(LNode)); //待插入结点s
        s->data = data;
        LNode *p = GetElem(L, i - 1);  //第i个结点的前面一个节点p
        s->next = p->next;
        p->next = s;
        printf("插入成功!");
        return L;
    } else {
        printf("插入失败!\n");
        return L;
    }

}


//8.删除操作,删除第i个结点
LinkList List_Delete(LinkList &L, int i) {
    if (i < 1 || i > List_Length(L)) {
        printf("删除失败!");
        return L;
    }

    LNode *p = GetElem(L, i - 1);//待删除结点前一结点指针p
    LNode *q = GetElem(L, i );     //待删除结点指针q
    p->next=q->next;
    free(q);
    printf("删除成功!");
    return L;
}



int main() {

    LinkList L;//头指针

    //1.头插法建立单链表
    //List_HeadInsert(L);  //头指针L传入,引用类型形参L接收

    //2.尾插法建立单链表
    List_TailList(L);

    //3.求表长
    printf("表长为:%d\n", List_Length(L));

    //4.打印单链表
    printf("打印单链表:");
    PrintLinkList(L);

    //5.按序号查找结点并返回
    LNode *p1 = GetElem(L, 2);
    printf("按序查找结果为:%d\n", p1->data);

    //6.按值查找并返回结点
    LNode *p2 = LocateElem(L, 7);
    if (p2 != NULL) {
        printf("按值查找结果为:%d\n", p2->data);
    } else {
        printf("未找到该值!\n");
    }

    //7.插入结点操作
    printf("执行插入操作后:\n");
    List_Insert(L, 7, 12);
    PrintLinkList(L);



    //8.删除操作,删除第i个结点
    printf("执行删除操作后:\n");
    List_Delete(L,4);
    PrintLinkList(L);


    return 0;
}

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值