数据结构—单链表

数据结构—单链表

   数据结构的单链表终于要搞完了,冲冲冲!
   在编写的时候发现有些功能重复了,这🦆子不太好!到时候精简吧!

//
//  slist.h
//  slist
//
//  Created by 小刘 on 2020/11/21.
//  Copyright © 小刘 All rights reserved.
//

#ifndef __SLITS__H_
#define __SLITS__H_


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

#define ElemType int

#define DEBUG_MSG(x) printf ("[DEBUG][%s][%d]:",__FUNCTION__,__LINE__); printf(x);
#define INFO_MSG(x)  printf ("[INFO.][%s][%d]:",__FUNCTION__,__LINE__); printf(x);
#define ERROR_MSG(x) printf ("[ERROR][%s][%d]:",__FUNCTION__,__LINE__); printf(x);

#define FUNC_OK         0
#define FUNC_ERR        -1

#define MALLOC(type,num) (type*)malloc(sizeof(type) * (num));

typedef struct Node {
    ElemType data;
    struct Node *next;
}Node;

typedef Node *ListNode;


void InitTheListHead(ListNode *head);//初始化头节点
void traverseTheList(ListNode head);//打印

void InsertTheListHead(ListNode *head);//前插法1
void InsertTheListTail(ListNode *head);//尾插法
void InsertTheListHeadway1(ListNode *head); //前插法2
void InvertedTheList(ListNode *head);//逆转

int LinkedListNumberLookup(ListNode *head, ElemType num);//数字查找
int LinkedListSubscriptLookup(ListNode *head,ElemType sub);//下标查找

int DeletesElementsLinkedList(ListNode *head, ElemType sub,ElemType num); // 删除
int InsertLinkedListMiddle(ListNode *head, ElemType sub,ElemType num); // 插入
int DestoryLinkedList(ListNode *head); //损毁链表
int MergeLinkedList(ListNode *La , ListNode *Lb ,ListNode *Lc); //合并


#endif
//
//  slist.c
//  slist
//
//  Created by 小刘 on 2020/11/21.
//  Copyright © 小刘 All rights reserved.
//

#include "slist.h"

void InitTheListHead(ListNode *head){
    * head = (Node *)malloc(sizeof(Node));
    assert(*head !=NULL);
    (*head)->next = NULL;
}


void InsertTheListHeadway1(ListNode *head){
    int num;
    while(scanf("%d",&num),num!=-1){
        Node * tail = (Node *)malloc (sizeof(Node));
        assert(tail !=NULL);
        tail->data =num;
        tail->next = (*head)->next;
        (*head)->next = tail ;
    } 
}//

void InsertTheListHead(ListNode *head){

    int num;
    Node *l1;
    while(scanf("%d",&num),num!=-1){
        l1 = (Node *) malloc (sizeof(Node));
        assert(l1!=NULL);
        l1->data = num;
        l1->next = NULL;
        l1->next = (*head)->next;
       (*head)->next = l1;
     }
}

//尾插法
void InsertTheListTail(ListNode *head){
    int num ;
        Node *l2 = NULL;
        Node *l3 = NULL;
       (*head)->next = NULL;
       l3 = (*head);
    while(scanf("%d",&num),num!=-1){  
        l2 = (Node*)malloc (sizeof(Node));
        assert(l2 != NULL);
        l2->data = num;
        l3->next = l2;
        l3 = l2;
    }
    l3->next =  NULL;
}


void traverseTheList(ListNode head){ //遍历

    Node *p = head->next; 
    while (p != NULL){
        printf(" %d ",p->data);
        p = p->next; 
    }
}


int LinkedListNumberLookup(ListNode *head, ElemType num){//数字查找

    int i = 1 ;
    Node *p ;
    p = (*head)->next;
    while(p->data != num){
        p = p->next;
        i++;
    }
    return i;
}

int LinkedListSubscriptLookup(ListNode *head,ElemType sub){//下标查找

    int i=1;
    for( Node *p = (*head)->next; p != NULL; p = p->next ){  
            if (i == sub){
                return p->data;
        }
    i++;
    }
    return 1;
}


int InsertLinkedListMiddle(ListNode *head, ElemType sub,ElemType num){ 
        int j = 0;
        if (LinkedListSubscriptLookup(head,sub)==1){
                printf("没有找到元素的位置\n");
                return EXIT_FAILURE;
        }
        Node * p =(*head);
        while(p && j<sub-1){
            p = p->next;
            j++;
        }
        if(!p || j>sub-1){
            return EXIT_FAILURE;
        }
        Node * s = (Node*)malloc(sizeof(Node));
        s->data = num;
        s->next = NULL;
        s->next = p->next; //等于号不能写反,
        p->next = s;
        
    return FUNC_OK;        
}


int DeletesElementsLinkedList(ListNode *head, ElemType sub,ElemType num){
    Node *p = (*head);
    int j =0;
    while(p->next && j<sub-1){
        p = p->next;
        j++;
    }
    if(!(p->next)||j > sub-1){ 
        printf("删除位置不合理");
        return 1;
    }
    Node *q;
    q =p->next;
    p->next = q->next;
    num = q->data;
    free(q);
    return FUNC_OK;
}


int DestoryLinkedList(ListNode *head){
    free(head);
}


int MergeLinkedList(ListNode *La , ListNode *Lb ,ListNode *Lc){ // 合并
        Node *pa = (*La)->next;
        Node *pb = (*Lb)->next;
        Node *pc;
        (*Lc) = (*La) = pc; 
        while(pa&&pb){
            if(pa->data<=pb->data){
                pc->next  = pa;
                pc = pa;
                pa =pa->next;               
        }
        else{
            pc->next = pb;
            pc=pb;
            pb = pb->next;
            }
        }
    pc->next = pa?pa :pb;
    free(Lb);
    return FUNC_OK;
}


//如果把链表里面的值改变,那么应该就是改数据域就可以了

   这里面还是有些工作没有完成的比如说排序算法这些东东。在以前的写代码过程,一般都是搬运代码,如何更改代码,虽然这样开发一个项目可能快,但是对之间的编写没有多大的提升,就很垃圾,哈哈哈哈!我何时才能变成那个华为的老师一样强啊,python虽然好玩,但相比于C还是差了点意思。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

脑瓜子嗡嗡的小刘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值