数据结构 C语言 01 -- 单向链表 实现 逆序

C语言实现单向链表的逆序

linklist.c中定义的单向链表相关操作的函数,大多实现逆序的过程用不到。
结果预览:
在这里插入图片描述

linklist.h

/*
linklist.h
*/

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

#ifndef __LINKLIST__
#define __LINKLIST__

typedef int data_t;
typedef struct linklist{
    data_t data;    //数据域
    struct linklist *next; //指针域
}Node,LinkList;

//逆序函数
void myfunc(LinkList *head);

//创建节点
LinkList *Create_Linklist();

//打印内容
void Show_Linklist(LinkList *head);

//判空
bool Linklist_Is_Empty(LinkList *head);

//计算表长
int Linklist_Length(LinkList *head);

//头插法
void Linklist_Insert_Head(LinkList *head,data_t data);

//插入 按位置
void Linklist_Insert_Pos(LinkList *head,int pos,data_t data);

//删除 按位置
void Linklist_Delete_Pos(LinkList *head,int pos);

//删除 按数据
void Linklist_Delete_Val(LinkList *head,data_t data);

//查找 按位置 返回数据
data_t Linklist_Search_Pos(LinkList *head,int pos);

//查找 按数据 返回位置
int Linklist_Search_Val(LinkList *head,data_t data);

//修改 按位置
void Linklist_Change_Pos(LinkList *head,int pos,data_t data);

//修改 按数据
void Linklist_Change_Val(LinkList *head,data_t o_data,data_t n_data);
#endif

linklist.c

/*
linklist.c
*/
#include "linklist.h"

//逆序函数
void myfunc(LinkList *head)
{
    Node *p = head->next->next;//从第二个结点开始
    Node *q = NULL;
    head->next->next = NULL;//将第一个结点变为尾结点

    while(p != NULL){
        q = p->next;

        p->next = head->next;
        head->next = p;

        p = q;
    }
}

//创建节点
LinkList *Create_Linklist()
{
    //创建节点
    LinkList *head = (LinkList *)malloc(sizeof(LinkList));
    if(head == NULL){
        printf("head malloc failed!\n");
        return NULL;
    }

    //节点next指向空
    head->next = NULL;

    return head;
}

//打印内容
void Show_Linklist(LinkList *head)
{
    Node *p = head;
    if(p->next == NULL){//判空
        printf("Empty!ERROR!\n");
        return;
    }
    while(p->next != NULL){
        p = p->next;
        printf("%d ",p->data);
    }
    puts("");
}

//判空
bool Linklist_Is_Empty(LinkList *head)
{
    if(head->next == NULL){
        return true;//返回 真
    }else{
        return false;//返回 假
    }
}

//计算表长
int Linklist_Length(LinkList *head)
{
    Node *p = head;
    int count = 0;
    while(p->next != NULL){
        count++;
        p = p->next;
    }
    return count;
}

//头插法
void Linklist_Insert_Head(LinkList *head,data_t data)
{
    Node *new = (Node *)malloc(sizeof(Node));//申请新空间
    new->data = data;
    new->next = head->next; //新节点 指向 头节点后的节点
    head->next = new; //新节点插入头节点后

}

//插入 按位置
void Linklist_Insert_Pos(LinkList *head,int pos,data_t data)
{
    if(pos <= 0 || pos > Linklist_Length(head)+1){
        printf("Insert pos ERROR!\n");
        return;
    }

    Node *p = head;
    Node *new = (Node *)malloc(sizeof(Node));
    new->data = data;

    int i = 0;
    while(++i < pos){//p指向pos前一个位置
        p = p->next;
    }
    
    new->next = p->next;
    p->next = new;

}

//删除 按位置
void Linklist_Delete_Pos(LinkList *head,int pos)
{
    if(pos<=0 || pos > Linklist_Length(head))
    {
        printf("Delete Pos ERROR!\n");
        return;
    }

    Node *p = head;
    Node *q = NULL;
    int i = 0;
    while(++i < pos){//p指向pos前一个位置
        p = p->next;
    }
    q = p->next;
    p->next = q->next;
    free(q);//释放
    
}

//删除 按数据
void Linklist_Delete_Val(LinkList *head,data_t data)
{
    if(Linklist_Is_Empty(head)){//判断空表
        printf("Is Empty List!\n");
        return;
    }

    Node *p = head->next;
    int i,j=0;
    for(i = 1; i <= Linklist_Length(head); i++){
        if(p->data == data){//找到 位置
            Linklist_Delete_Pos(head,i);
            j = 1;
            break;
        }else{
            p = p->next;
        }
        
    }
    if(j){
        printf("Data is not exist!\n");
        return;
    }

}

//查找 按位置 返回数据
data_t Linklist_Search_Pos(LinkList *head,int pos)
{
    if(pos <= 0 || pos > Linklist_Length(head)){
        printf("Search Pos ERROR!\n");
        return -1;
    }
    
    Node *p = head;
    int i = 0;
    while(++i <= pos){//p指向查找的位置
        p = p->next;
    }

    return p->data;
}

//查找 按数据 返回位置
int Linklist_Search_Val(LinkList *head,data_t data)
{
    if(Linklist_Is_Empty(head)){//判断空表
        printf("Link Is Empty!ERROR!\n");
        return -1;
    }

    Node *p = head->next;
    int i;
    for(i = 1; i <= Linklist_Length(head); i++){
        if(p->data == data){
            return i;
        }else{
            p = p->next;
        }
    }
    printf("Data is not exist!ERROR!\n");
    return -1;
}

//修改 按位置
void Linklist_Change_Pos(LinkList *head,int pos,data_t data)
{
    if(pos <= 0 || pos > Linklist_Length(head)){
        printf("Change Pos ERROR!\n");
        return;
    }
    
    Node *p = head;
    int i = 0;
    while(++i <= pos){//p指向pos位置
        p = p->next;
    }
    
    p->data = data;

}

//修改 按数据
void Linklist_Change_Val(LinkList *head,data_t o_data,data_t n_data)
{
    if(Linklist_Is_Empty(head)){//判断空表
        printf("List Is Empty!ERROR!\n");
        return;
    }

    Node *p = head->next;
    int i;
    for(i = 1; i <= Linklist_Length(head); i++){
        if(p->data == o_data){
            p->data = n_data;
            return;
        }else{
            p = p->next;
        }
    }
    printf("Data is not exist!ERROR!\n");
}

main.c

#include "linklist.h"
int main()
{
    LinkList *link = Create_Linklist();
    
    //初始赋值
    int n = 10;
    while(n--){
        Linklist_Insert_Head(link,n);
    }

    //逆序前
    printf("Before Sort: ");
    Show_Linklist(link);

    myfunc(link);//逆序
    
    //逆序后
    printf("After  Sort: ");
    Show_Linklist(link);
	return 0;
}
  • 7
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值