线性链表

                线性链表
                LinkList.c
#define   _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include "stdlib.h"
#include "stdio.h"
#include "string.h"
#include "LinkList.h"
using namespace std;
typedef struct _tag_LinkList
{
    LinkListNode pHead;
    int length;
}TLinkList;

LinkList* LinkList_Create()
{
    int ret = 0;
    TLinkList *tem = NULL;
    tem = (TLinkList*)malloc(sizeof(TLinkList));//分配内存
    {
        if (tem==NULL)
        {
            ret = -1;
            printf("func (TLinkList*)malloc(sizeof(TLinkList)) err %d\n", ret);
        }
    }
    memset(tem, 0, sizeof(TLinkList));
    tem->pHead.next = NULL;
    tem->length = 0;
    return tem;
}
void LinkList_Destroy(LinkList* list)
{
    TLinkList *ptem = NULL;
    if (list==NULL)
    {
        return;
    }
    ptem = (TLinkList*)list;//上层应用传下来的指针,转化成TLinkList指针
    if (list!=NULL)
    {
        free(ptem);
    }
    list = ptem=NULL;
    return ;
}

void LinkList_Clear(LinkList* list)
{
    TLinkList*pTem = NULL;
    if (list==NULL)
    {
        printf("LinkList_Clear() err\n");
        return;
    }
    pTem = (TLinkList*)list;
    pTem->length = 0;
    pTem->pHead.next = NULL;
    list = pTem;
    return ;
}
int LinkList_Length(LinkList* list)
{
    TLinkList*pTem = NULL;
    if (list == NULL)
    {
        printf("LinkList_Length() err\n");
        return 0;
    }
    pTem = (TLinkList*)list;
    return pTem->length;
}
int LinkList_Insert(LinkList* list, LinkListNode* node, int pos)
{
    int ret = 0;
    LinkListNode *pCurrent = NULL;//
    TLinkList*pTem = NULL;
    if (list == NULL||node==NULL||pos<0)
    {
        ret = -1;
        printf("LinkList_Insert() err %d\n ",ret);
        return ret;
    }
    pTem = (TLinkList*)list;
    pCurrent = &pTem->pHead;
    for (int i = 0; (i<pos) && pCurrent->next != NULL; i++)//寻找要插入的位置
    {
        pCurrent = pCurrent->next;  //往后移动
    }
    //开始插入节点
    node->next = pCurrent->next; //要插入的节点链接插入点的后一节点
    pCurrent->next = node;//前面链接前一节点
    pTem->length++;
    return 0;
}
LinkListNode* LinkList_Get(LinkList* list, int pos)
{
    LinkListNode*ret = NULL;
    LinkListNode *pCurrent = NULL;//
    TLinkList*pTem = NULL;

    if (list == NULL || pos < 0)
    {
        printf("LinkList_Insert() err \n ");
        return NULL;
    }
    pTem = (TLinkList*)list;
    pCurrent = &pTem->pHead;
    for (int i = 0; (i < pos) && pCurrent->next != NULL; i++)
    {
        pCurrent = pCurrent->next; //让pCurrent往后移动 
    }
    ret = pCurrent->next;
    return ret;
}
LinkListNode* LinkList_Delete(LinkList* list, int pos)
{
    LinkListNode*ret = NULL;
    LinkListNode *pCurrent = NULL;//
    TLinkList*pTem = NULL;
    pTem = (TLinkList*)list;
    if (list == NULL || pos < 0||pos>=pTem->length)
    {
        printf("LinkList_Insert() err \n ");
        return NULL;
    }
    pCurrent = &pTem->pHead;
    for (int i = 0; i < pos; i++)
    {
        pCurrent = pCurrent->next;  //让pCurrent往后移动
    }
    ret = pCurrent->next;//缓存要删除节点的位置
    pCurrent->next = pCurrent->next->next;//核心代码
    pTem->length--;
    return ret;
}
LinkList.c
#define   _CRT_SECURE_NO_WARNINGS
#pragma  once
#ifndef _MYLINKLIST_H_
#define _MYLINKLIST_H_

#include <iostream>
using namespace std;

typedef void LinkList;
typedef struct _tag_LinkListNode
{
    struct _tag_LinkListNode* next;
}LinkListNode;

LinkList*     LinkList_Create();//创建链表
void          LinkList_Destroy(LinkList* list);//销毁链表
void          LinkList_Clear(LinkList* list);//清除
int           LinkList_Length(LinkList* list);//求长度
int           LinkList_Insert(LinkList* list, LinkListNode* node, int pos);//插入
LinkListNode* LinkList_Get(LinkList* list, int pos);//获取
LinkListNode* LinkList_Delete(LinkList* list, int pos);//删除

#endif

main.c

#define  _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include "LinkList.h"
#include <string.h>
using namespace std;

struct Student
{
    LinkListNode node;  //Linux内核原理:业务结点中有链表结点
    char name[128];
    int age;
};

void print_LinkList(void* list)  //遍历打印链表
{
    for (int i = 0; i < LinkList_Length(list); i++)
    {
        struct Student *tmp = (struct Student*)LinkList_Get(list, i);
        printf("name: %s , age: %d\n", tmp->name, tmp->age);
    }
}

int main()
{
    Student s1;  
    Student s2;  
    Student s3;  
    Student s4;
    strcpy(s1.name, "xiaoli");  s1.age = 20;
    strcpy(s2.name, "Mingming");  s2.age = 23;
    strcpy(s3.name, "Meimei");  s3.age = 22;
    strcpy(s4.name, "Me");  s4.age = 25;

    LinkList* list = list = LinkList_Create();

    /************************************************************************/
    //case1:
    LinkList_Insert(list, &s1.node, 0); //把s1中的链表结点s1.node结点插入到链表list
    LinkList_Insert(list, &s2.node, 0); //把s2中的链表结点s2.node结点插入到链表list
    LinkList_Insert(list, &s3.node, 0); //把s3中的链表结点s3.node结点插入到链表list
    LinkList_Insert(list,(LinkListNode*)(&s4.node),1);


    print_LinkList(list);
    cout << "删除结点" << endl;
    LinkList_Delete(list, 1);
    cout << "删除结点之后" << endl;
    print_LinkList(list);
    system("pause");
    return 0;
}

/*
void main()
{
    int array[15];
    for (int i = 0; i < 15;i++)
    {
        array[i] = i;
    }
    for (int i = 0; i < 10; i++)
    {
        cout << array[i]<<" ";
    }
    system("pause");
}
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值