0
点赞
收藏
分享

微信扫一扫

Java架构师之路四、分布式系统:分布式架构、分布式数据存储、分布式事务、分布式锁、分布式缓存、分布式消息中间件、分布式存储等。

星巢文化 2024-02-24 阅读 13

题目:链表作业

代码:

func.c

#include <stdio.h>
#include <stdlib.h>
#include "./d220.h"

//创建一个带头结点的单链表
linkList* create_linkList()
{
    linkList* head = (linkList*)malloc(sizeof(linkList));
    if(NULL == head)
    {
        printf("头结点申请失败,创建单链表失败\n");
        return NULL;
    }

    head->text.len = 0;//初始化头结点中链表长度为0
    head->next = NULL;//初始化头结点中的指针域为NULL

    return head;
}

//头插法
void insertHead_linkList(linkList* head,dataType num)
{
    //创建一个新的结点
    linkList* temp =(linkList*)malloc(sizeof(linkList));
    if(NULL == temp)
    {
        printf("结点申请失败,头插失败\n");
        return;
    }
    temp->text.data = num;
    temp->next=NULL;

    //头插法插入数据
    temp->next = head->next;
    head->next = temp;

    //更新头结点中记录的链表长度
    head->text.len++;

    return ;
}

//遍历链表
void show_linkList(linkList* head)
{
    linkList* p=head;
    while(p->next != NULL)
    {
        p = p->next;
        printf("%d ",p->text.data);
    }
    printf("\n");
    return;
}

//尾插法插入数据
void insertTail_linkList(linkList*head,dataType num)
{
    linkList* temp=(linkList*)malloc(sizeof(linkList));
    if(NULL == temp)
    {
        printf("结点申请失败,尾插失败\n");
        return;
    }

    //初始化新的结点
    temp->next=NULL;
    temp->text.data = num;

    //尾插法插入数据
    //找到链表的尾结点
    linkList* p=head;
    while(p->next != NULL)
    {
        p=p->next;
    }

    p->next = temp;
    temp->next = NULL;

    //更新头结点中记录的链表长度
    head->text.len++;

    return;
}

//判断链表是否为空
int isEmpty_linkList(linkList* head)
{
    return head->next==NULL ? 1:0;
}

dataType deleteHead_linkList(linkList* head)
{
    //判断链表是非为空
    if(isEmpty_linkList(head))
    {
        printf("头删失败,链表为空\n");
        return -1;
    }

    //头删法删除
    linkList* temp = head->next;
    head->next = temp->next;

    //另存要删除的结点中的有效数据,然后释放
    dataType num=temp ->text.data;
    free(temp);
    temp = NULL;

    //更新头结点中记录的链表长度
    head->text.len--;
}

//尾删法
dataType deleteTail_linkList(linkList* head)
{
    //判断链表是非为空
    if(isEmpty_linkList(head))
    {
        printf("头删失败,链表为空\n");
        return -1;
    }

    linkList* temp = head;//让temp指向头结点

    //循环找倒数第二个结点
    while(temp->next->next!=NULL)                                                                                                                                                                                                                                                                                                                                                                     
    {
        temp = temp->next;
    }
    //上述循环结束后,找到了倒数第2个结点

    dataType num = temp->next->text.data;//将倒数第一个结点的数据另存

    free(temp->next);//释放倒数第一个结点
    temp->next = NULL;//将倒数第二个结点的指针域指向NULL

    //更新头结点中记录的链表长度
    head->text.len--;
}

//按照位置插入,位置编号从一开始

void insertByPos_linkList(linkList* head,int pos,dataType num)
{
    //判断位置是非合法
    if(pos<1||pos>head->text.len+1)
    {
        printf("pos=%d 插入位置非法,插入失败\n",pos);
        return;
    }

    //循环查找要插入位置的前一个结点位置
    linkList* p=head;
    for(int i=0;i<pos-1;i++)
    {
        p=p->next;
    }

    //上述循环完毕后,p指向要插入位置的前一个结点

    //创建一个新的结点插入到链表中
    linkList* temp=(linkList*)malloc(sizeof(linkList));
    if(NULL == temp)
    {
        printf("结点申请失败,尾插失败\n");
        return;
    }
    temp->text.data = num;
    temp->next = NULL;

    //插入结点
    temp->next = p->next;
    p->next = temp;

    //更新头结点中记录的链表长度
    head->text.len++;

    return;
}

//按位置删除
dataType deleteByPos_linkList(linkList* head,int pos)
{
    //判断链表是否为空
    if(isEmpty_linkList(head))
    {
        printf("链表为空,删除失败\n");
        return -1;
    }

    //判断删除位置是否合法
    if(pos<=0||pos>head->text.len)
    {
        printf("pos=%d 删除位置非法,删除失败\n",pos);
        return -1;
    }

    //循环查找要删除位置的前一个结点位置
    linkList* p=head;
    for(int i=0;i<pos-1;i++)
    {
        p=p->next;
    }
    //上述循环完毕后,p指向要删除位置的前一个结点

    //修改指向,释放要删除的结点
    linkList* temp=p->next;  //另存要删除的结点的地址
    p->next=temp->next;

    dataType num = temp->text.data;
    free(temp);
    temp = NULL;

    //更新头结点中记录的链表长度
    head ->text.len--;

    return num;
}


main.c

#include <stdio.h>
#include "./d220.h"
int main(int argc, const char *argv[])
{
    linkList* head = create_linkList();
    insertHead_linkList(head,10 );
    insertHead_linkList(head,20 );
    show_linkList(head);

    insertTail_linkList(head,20);
    insertTail_linkList(head,30);
    insertTail_linkList(head,40);
    insertTail_linkList(head,50);
    show_linkList(head);               

    deleteHead_linkList(head);
    show_linkList(head);
    deleteHead_linkList(head);
    show_linkList(head);
    deleteHead_linkList(head);
    show_linkList(head);
    deleteHead_linkList(head);
    show_linkList(head);
    deleteTail_linkList(head);
    show_linkList(head);

    insertByPos_linkList(head,1,66);
    show_linkList(head);
    deleteByPos_linkList(head,1);
    show_linkList(head);



    return 0;
}

.h文件:

#ifndef  LINKLIST_H_
#define  LINKLIST_H_

typedef int dataType;

union msg{
    dataType data;
    int len;
};

typedef struct node{
    union msg text;
    struct node* next;
}linkList;

linkList* create_linkList();
void insertHead_linkList(linkList* head,dataType num);
void show_linkList(linkList* head);
void insertTail_linkList(linkList*head,dataType num);
dataType deleteHead_linkList(linkList* head);
dataType deleteTail_linkList(linkList* head);
void insertByPos_linkList(linkList* head,int pos,dataType num);
dataType deleteByPos_linkList(linkList* head,int pos);





#endif                                                             

运行结果:

举报

相关推荐

0 条评论