链表的一些基本接口

头文件:

#ifndef _LINKLIST_H_
#define _LINKLIST_H_

#define SUCCESS  0
#define FAILURE -1

struct node
{
    int data;
    struct node *next;
};

typedef struct node Node;
typedef Node *LinkList;

int ListInit(LinkList *L);
int ListInsert(LinkList L, int k, int e);
int ListLength(LinkList L);
int ListTraverse(LinkList L);
int ListDelete(LinkList L, int k, int *e);
int ListLocate(LinkList L, int k);
int ListClear(LinkList L);
int Destroy(LinkList *L);

#endif

主函数:

#include <stdio.h>
#include "Linklist.h"

int main()
{
    int ret, i, e;
    LinkList list;//定义头指针,是一个结构体指针,没有初始化是一个随机值
    ret = ListInit(&list);//要把指针的地址传进去,就如同一个整型你要改变值,需要取地址一样 
    if(ret == SUCCESS)
    {
        printf("Init Success!\n");
    }

    else
    {
        printf("Init Failure!\n");
    }

    for(i = 0; i < 5; i++)
    {
        ret = ListInsert(list, i + 1, i);//把i插入到第i+1个结点
        if(SUCCESS == ret)
        {
            printf("Insert %d success!\n", i);
        }

        else
        {
            printf("Insert %d failed!\n", i);
        }
    }

    ret = ListLength(list);
    printf("the length is %d\n", ret);

    ret = ListTraverse(list);
    if(ret == SUCCESS)
    {
        printf("Traverse success!\n");
    }

    else
    {
        printf("Traverse failure!\n");
    }

    ret = ListDelete(list, 3, &e);//删除第3个数
    if(ret == SUCCESS)
    {
        printf("Delete %d success!\n", e);
    }

    else
    {
        printf("Delete %d failure!\n", e);
    }

    ret = ListTraverse(list);
    if(ret == SUCCESS)
    {
        printf("Traverse success!\n");
    }

    ret = ListLocate(list, 1);
    if(ret != FAILURE)
    {
        printf("Locate is %d\n", ret);
    }

    else
    {
        printf("Locate failure!\n");
    }

    ret = ListClear(list);
    if(ret == SUCCESS)
    {
        printf("Clear success!\n");
    }

    else
    {
        printf("Clear failure!\n");
    }

    ret = ListTraverse(list);

    ret = ListDestroy(&list);
    if(ret == SUCCESS)
    {
        printf("Destroy success!\n");
    }

    else
    {
        printf("Destroy failure!\n");
    }


    return 0;
}

各个接口模块:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "Linklist.h"

int ListInit(LinkList *L)
{
    (*L) = (LinkList)malloc(sizeof(Node));//为头指针分配了一个地址
    if((*L) == NULL)
    {
        return FAILURE;
    }

    (*L)->next = NULL;//头结点的指针域指向NULL
    return SUCCESS;
}

int ListInsert(LinkList L, int k, int e)
{
    if(NULL == L)
    {
        return FAILURE;
    }

    LinkList p = L;//定义一个指针指向头结点
    LinkList l;//插入的结点
    int j = 1;//计数器
    while(p && j < k)
    {
        p = p->next;
        j++;
    }//把p移到k-1结点处
    if(!p && j > k)
    {
        return FAILURE;
    }

    l = (LinkList)malloc(sizeof(Node));
    if(NULL == l)
    {
        return FAILURE;
    }

    l->data = e;
    l->next = p->next;
    p->next = l;

    return SUCCESS;
}

int ListLength(LinkList L)
{
    if(NULL == L)
    {
        return FAILURE;
    }

    int length = 0;
    LinkList p = L;

    while(p->next)
    {
        length++;
        p = p->next;
    }

    return length;
}

int ListTraverse(LinkList L)
{
    if(NULL == L)
    {
        return FAILURE;
    }

    LinkList p = L;

    while(p->next)
    {
        p = p->next;
        printf("%d\n", p->data);
    }

    return SUCCESS;
}

int ListDelete(LinkList L, int k, int *e)
{
    if(NULL == L)
    {
        return FAILURE;
    }

    LinkList p = L;
    LinkList l = NULL;
    int j = 1;

    while(p->next && j < k)
    {
        p = p->next;
        j++;
    }

    if(!(p->next) || j > k)
    {
        return FAILURE;
    }

    l = p->next;
    *e = p->next->data;
    p->next = p->next->next;
    free(l);

    return SUCCESS;
}

int ListLocate(LinkList L, int k)
{
    if(NULL == L)
    {
        return FAILURE;
    }

    LinkList p = L;
    int count = 0;

    while(p->next)
    {
        p = p->next;
        count++;
        if(p->data == k)
        break;
    }

    return count;
}

int ListClear(LinkList L)//清空链表,只剩下头结点
{
    if(L == NULL)
    {
        return FAILURE;
    }

    LinkList p = L->next;

    while(p)
    {
        L->next = p->next;
        free(p);
        p =L->next;
    }

    return SUCCESS;
}

int ListDestroy(LinkList *L)
{
    free(*L);
    *L = NULL;

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值