云计算百科
云计算领域专业知识百科平台

单链表基本功能的实现(优化)

上个作品我们做了基本的单链表,单还是缺少一些功能,今天把单链表的头插法和尾插法给大家写上

//定义带头结点的单链表
#include<stdio.h>
#include<stdbool.h>
#include<stdlib.h>
typedef struct LNode
{
    int data; //数据域
    struct LNode* next; //指针域
}LNode,*LinkList;
bool InitList(LinkList* L) //初始化
{
    *L = (LNode*)malloc(sizeof(LNode)); //分配一个头结点
    if (*L == NULL)
        return false;//分配不足
    (*L)->next = NULL;
    return true;
}
void InitData_tail(LinkList* L) //尾插法
{
    LNode* r = *L; //r指针永远指向最后一个结点
    int i;
    printf("请输入你要写入的数据,输入9999停止:");
    scanf("%d", &i);
    while (i != 9999)
    {
        LNode *p = (LNode*)malloc(sizeof(LNode));
        p->data = i;
        r->next = p;
        r = p;
        printf("请输入你要写入的数据,输入9999停止:");
        scanf("%d", &i);
    }
    r->next = NULL;
}
void InitData_head(LinkList* L)//头插法(实现逆序)
{
    LNode* p = *L;
    int i;
    printf("请输入你要写入的数据,输入9999停止:");
    scanf("%d", &i);
    while (i != 9999)
    {
        p = (LNode*)malloc(sizeof(LNode));
        p->data = i;
        p->next = (*L)->next;
        (*L)->next = p;
        printf("请输入你要写入的数据,输入9999停止:");
        scanf("%d", &i);
    }
    return;
}
//LinkList LocalElem(LinkList L, int n6)//按值查找
//{
//    LNode* p = L->next;
//    if (p == NULL)
//        return NULL;
//    while (p != NULL && p->data != n6)
//    {
//        p = p->next;
//    }
//    return p;
//}
LinkList GetElem(LinkList L, int n5)//按位查找
{
    LNode* p = L;
    int j = 0;
    if (n5 < 1)
        return NULL;
    while (p != NULL && j < n5)
    {
        p = p->next;
        j++;
    }
    return p;
}

bool InsertLNode(LinkList* L,int i, int n1)//后插操作
{
    if (i < 1)
        return false;
    //LNode* p = *L; //表头指针不能动,需要再建立一个指针p
    //int j = 0; //用来记录p的位置

    //while (p != NULL && j < i – 1)//保证p指向的都是正确位置
    //{
    //    p = p->next;
    //    j++;
    //}
    LNode* p = GetElem(*L, i – 1);//调用查找函数
    LNode* s = (LNode*)malloc(sizeof(LNode));
    if (s == NULL)
        return false;
    s->data = n1;
    s->next = p->next;
    p->next = s;
    return true;

}
bool Front_InserLNode(LinkList* L,int n2,int n3)//前插操作
{
    
    if (n2 < 1)
        return false;
    LNode* p = *L; //指向首元素
    if (p->next == NULL)
        return false;

    int j = 0;
    while (p != NULL && j < n2 – 1)
    {
        p = p->next;
        j++;
    }
    LNode *s = (LNode*)malloc(sizeof(LNode));

    s->data = p->data; //把p结点下的数据域传给s结点
    p->data = n3;//把要插入的数传给p结点
    s->next = p->next;
    p->next = s;

    return true;

}
bool DeleteLNode(LinkList * L,int n4)//删除
{
    if (n4 < 1)
        return false;
    /*LNode* p = *L;
    if (p == NULL)
        return false;
    int j = 0;
    while (p != NULL && j < n4 – 1)
    {
        p = p->next;
        j++;
    }*/
    LNode* p = GetElem(*L, n4 – 1);
    LNode* q = p->next;
    p->next = q->next;
    free(q);

    return true;
}
void PrintLNode(LinkList L)//打印链表
{
    if (L->next == NULL)
        return;
    LNode *p = L->next; //指向下一个
    
    while (p != NULL)
    {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\\n");

}

int main()
{
    LinkList L; //指向单链表的指针
    bool x1 = InitList(&L);
    if (x1 == false)
        return 0;
    
    InitData_tail(&L);//初始数据,尾插法(注意创建一个指向表尾的指针)
    //InitData_head(&L);//初始数据,头插法(用于逆值链表)
    LNode* print = L->next;
    while (print != NULL)
    {
        printf("%d ", print->data);
        print = print->next;
    }
    printf("\\n");

    int n;
    printf("你想插入几个数:");
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        printf("请输入要在第几位插入什么数:");//后插操作
        int i;
        int n1;
        scanf("%d %d", &i, &n1);
        bool x2 = InsertLNode(&L, i, n1);//按位插入

        if (x2 != true)
            printf("插入失败\\n");
        else
            printf("插入成功\\n");
    }

    printf("请输入你要在第几个结点前插什么数:");//前插操作
    int n2, n3;
    scanf("%d %d", &n2,&n3);
    bool x3;
    x3 = Front_InserLNode(&L, n2, n3);
    if (x3 != true)
        printf("插入失败\\n");
    else
        printf("插入成功\\n");

    printf("请输入你要删除的第几个结点:");
    int n4;
    scanf("%d", &n4);
    DeleteLNode(&L,n4); //删除链表元素
    PrintLNode(L);//打印链表
    
    LNode* p1 = GetElem(L, 3);//按位查找,假设查找第三个结点
    printf("第三个结点为%d", p1->data);

    return 0;
}

赞(0)
未经允许不得转载:网硕互联帮助中心 » 单链表基本功能的实现(优化)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!