Linux下学C语言——第十七节 数据结构|单向链表

快捷键

mv 源文件名 目标文件名 //可以修改源文件名的名字

cp ../head/makefile  ./        //把上层目录下的head里的makefile文件拷贝到当前目录

 有头单向链表的实现

list.h

#ifndef LIST_H__
#define LIST_H__

typedef int datatype;

typedef struct node_st
{
    datatype data;
    struct node_st *next;
}list;

list *list_create();

int list_insert_at(list *,int i,datatype *);

int list_order_insert(list *,datatype *);

int list_delete_at(list *,int i,datatype *);

int list_delete(list *,datatype *);

int list_isempty(list *);

void list_display(list *);

void list_destroy(list *);

#endif

list.c 

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

#include "list.h"
list *list_create()
{
    list *me;

    me = malloc(sizeof(*me));

    if(me == NULL)
        return NULL;

    
    me -> next = NULL;
    return me;
}

int list_insert_at(list *me,int i,datatype *data)
{
    int j= 0;

    list *node =me , *newnode;

    if(i<0)
        return -1;

    while(j<i && node != NULL)
    {
        node = node ->next;
        j++;
    }
    if(node)
    {
        newnode = malloc(sizeof(*newnode));
        if(newnode == NULL)
            return -2;
        newnode -> data = *data;

        newnode -> next = node->next;
        node->next = newnode;

        return 0;
    }
    else
        return -3;

}

int list_order_insert(list *me,datatype *data)
{   
    list *p =me;
    list *q;
    while(p->next  && p->next->data < *data)
        p = p->next;

    q = malloc (sizeof(*q));
    if(q == NULL)
        return -1;

    q->data = *data;
    q->next = p->next;
    p->next =q;
    return 0;
}

int list_delete_at(list *me,int i,datatype *data)
{
    int j=0;
    list *p=me,*q;
    *data = -1;
     while(j<i&&p)
     {
         p = p->next;
         j++;
     }
     if(p)
     {

    printf("5=====\n");
         q = p->next;
         p->next = q ->next;
        
         *data = q->data;
        
         free(q);
         q=NULL;
    printf("reurn=====\n");
        return 0;
     }
    printf("6=====\n");
    return -1;
}

int list_delete(list *me,datatype *data)
{
    list *p = me,*q;
    while(p->next && p->next->data != *data)
        p = p->next;
    if(p->next == NULL)
        return -1;
    else
    {
       q= p->next ;
       p->next = q->next;
       free(q);
       q=NULL;

    }
    return 0;
}

int list_isempty(list *me)
{
    if(me -> next == NULL)
        return 0;
    return 1;
}

void list_display(list *me)
{
    list *node = me -> next;
    if(list_isempty(me) == 0)
        return ;
    while(node != NULL)
    {
        printf("%d ",node->data);
        node = node -> next;
    }
    printf("\n");
    return ;
}
void list_destroy(list *me)
{
    list *node ,*next;

    for(node = me->next;node != NULL; node = node -> next)
    {
        next = node->next;

        free(node);
    }
    free(me);
    return ;
}

main.c 

 

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

#include "list.h"
int main()
{
    list *l;
    datatype arr[] = {12,4,8,23,34,9,45};
    int i;

    l = list_create();
    if(l == NULL)
        exit(1);
    
    for(i=0;i<sizeof(arr)/sizeof(*arr);i++)
    {
        list_order_insert(l,&arr[i]);

    }
    list_display(l);
    
    
    datatype value ;
    int err = 0;
    printf("1=====\n");
    err = list_delete_at(l,3,&value);
    printf("err=====\n");
    if(err == -1)
    {    
    printf("2=====\n");
        exit(1);
    }
    printf("3=====\n");
    list_display(l);
    printf("%d\n",value);
    printf("4=====\n");
    
    #if 0
    datatype value = 12;
    list_delete(l,&value);
    list_display(l);
    #endif

    list_destroy(l);

}

makefile:




all:list
list:main.o list.o
        $(CC) $^ -o  $@
clean:
        rm   *.o list -rf

 执行:

[tom@CentOS7 head]$ ./list 
4 8 9 12 23 34 45 
1=====
5=====
reurn=====
err=====
3=====
4 8 9 23 34 45 
12
4=====

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值