2月20号作业

本文展示了如何在C程序中通过函数实现链表的基本操作,如头尾插入、删除节点及对链表进行排序。
摘要由CSDN通过智能技术生成

#include <stdio.h>
#include "./fun.h"
int main(int argc, const char *argv[])
{
    datatype num;
    linkList* head=create_linkList();
    insertHead_linkList(head,100);
    insertHead_linkList(head,10);
    insertHead_linkList(head,199);
    insertHead_linkList(head,79);
    insertHead_linkList(head,23);
    insertHead_linkList(head,32);
    show_linkList(head);
    printf("-----------------------------\n");
    insertTail_linkList(head,45);
    insertTail_linkList(head,67);
    insertTail_linkList(head,89);
    insertTail_linkList(head,12);
    show_linkList(head);
    printf("len=%d\n",head->text.len);
    printf("-----------------------------\n");
    num=deleteHead_linkList(head);
    printf("删除的是:%d len=%d\n",num,head->text.len);
    num=deleteHead_linkList(head);
    printf("删除的是:%d len=%d\n",num,head->text.len);
    num=deleteTail_linkList(head);
    printf("删除的是:%d len=%d\n",num,head->text.len);
    num=deleteTail_linkList(head);
    printf("删除的是:%d len=%d\n",num,head->text.len);
    show_linkList(head);
    printf("----------------------------\n");
    insertPos_linkList(head,1,234);
    show_linkList(head);
    insertPos_linkList(head,10,24);
    insertPos_linkList(head,5,23);
    show_linkList(head);
    printf("---------------------------\n");
    deleteBypos_linkList(head,3);
    show_linkList(head);
    printf("---------------------------\n");
    insertSort_linkList(head,23);
    insertSort_linkList(head,560);
    insertSort_linkList(head,43);
    insertSort_linkList(head,12);
    show_linkList(head);
    return 0;
}

#include <stdio.h>
#include <stdlib.h>
#include "./fun.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;
}
//判断链表是否为空
int isEmpty_linkList(linkList* head)
{
    return head->next == NULL?1:0;
}
//头插法插入数据
int insertHead_linkList(linkList* head,datatype num)
{
        //创建一个新的结点
        linkList* temp=(linkList*)malloc(sizeof(linkList));
        if(NULL == temp)
        {
            printf("结点申请失败,头插失败\n");
            return -1;    
        }
        temp->text.data = num;
        temp->next = NULL;
        
        //头插法插入数据
        temp->next=head->next;        
        head->next=temp;

        head->text.len++;
        return 0;
}

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

}

//从尾结点插入数据
int insertTail_linkList(linkList* head,datatype num)
{
        //创建一个新的结点
        linkList* temp=(linkList*)malloc(sizeof(linkList));
        if(NULL == temp)
        {
            printf("结点申请失败,头插失败\n");
            return -1;
        }
        //初始化新的结点
        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 0;
}

//从头结点删除
datatype deleteHead_linkList(linkList* head)
{
    if(isEmpty_linkList(head))
    {
        printf("头删失败,链表为空\n");
        return (datatype)-1;
    }
    //头删法删除
    linkList* temp= head->next;
    head->next = temp->next;
    //宁存要删除的结点中的所有有效数据,然后释放结点
    datatype num = temp->text.data;
    free(temp);
    temp=NULL;

    //更新头结点中记录的链表长度
    head->text.len--;
    return num;
}
//从尾点删除
datatype deleteTail_linkList(linkList* head)
{
    if(isEmpty_linkList(head))
    {
        printf("头删失败,链表为空\n");
        return (datatype)-1;
    }

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

    //循环找到倒数第2个结点
    while(temp->next->next!=NULL)
    {
        temp = temp->next;//向后移动一个
    }
    //上述循环结束后,找到了倒数第2个结点
    datatype num=temp->next->text.data;
    free(temp->next);
    temp->next=NULL;

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

//按位置插入数据
void insertPos_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");
    }
    temp->text.data=num;
    temp->next=NULL;

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

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

    return ;
}

//按照位置删除数据,位置编号从1开始
datatype deleteBypos_linkList(linkList* head,int pos)
{
    //判断链表是否为空
    if(isEmpty_linkList(head))
    {
        printf("头删失败,链表为空\n");
        return (datatype)-1;
    }

    //判断和\删除的位置是否合法
    if(pos<1 || pos>head->text.len)
    {
        printf("pos=%d 插入位置非法,插入失败\n",pos);
        return(datatype)-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;
}

void insertSort_linkList(linkList* head,datatype num)
{
    //创建一个新的节点插入到链表中
    linkList* temp=(linkList*)malloc(sizeof(linkList));
    if(NULL == temp)
    {
        printf("结点申请失败,头插失败\n");
    }
    temp->text.data=num;
    temp->next=NULL;
    
    linkList* p=head; //遍历链表,找到比num大的结点前一个位置

    while(p->next !=NULL)
    {
        if(p->next->text.data>temp->text.data)
        {
            break;
        }
        else
        {
            p=p->next;
        }
    }
    temp->next=p->next;
    p->next=temp;

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

#ifndef __FUN_H__
#define __FUN_H__
typedef int datatype;
union msg{
    datatype data;
    int len;
};
typedef struct node{
    union msg text;
    struct node *next;
}linkList;
linkList* create_linkList();
int insertHead_linkList(linkList* head,datatype num);
void show_linkList(linkList* head);
int insertTail_linkList(linkList* head,datatype num);
datatype deleteHead_linkList(linkList* head);
datatype deleteTail_linkList(linkList* head);
void insertPos_linkList(linkList* head,int pos,datatype num);
datatype deleteBypos_linkList(linkList* head,int pos);
void insertSort_linkList(linkList* head,datatype num);
#endif

a.out:01_main.o 02_linklist.o
    gcc 01_main.o 02_linklist.o -o a.out

1main.o:1main.c
    gcc 01_main.c -c -o 01_main.o

1.o:1.c
    gcc 02_linklist.c -c -o 02_linklist.o

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值