数据结构——线性表(链式存储)

1、 顺序表:
①需要一片连续的内存空间,成员可以随机访问,访问效率高
②插入删除数据存在数据搬移的现象,效率低
③存储密度高
链表的特点:
①不需要连续的内存空间,不能随机访问元素,访问效率低
②插入删除数据不存在数据搬移的现象,效率高
③存储密度比较低
2、
无头链表:第一个节点为数据节点,加入删除第一个节点,链表的入口发生改变,操作维护比较复杂
有头链表:浪费第一个节点作为头节点,作为操作维护链表的同一入口,操作维护链表比较简单

有头链表用的比较多
3、链表节点如何定义:
struct Link
{
data_t data;
struct Link *pNext;
}
4、链表的插入
pNode->pNext = pTmp->pNext;
pTmp->pNext = pNode;

5、链表的删除
pDel = pTmp->pNext;
pTmp->pNext = pDel->pNext;
free(pDel);
pDel = NULL;

循环链表

6、双向链表的定义:

struct int
{
data_t data;
struct Link *pPri;
struct Link *pNext;
}

7、插入

pNode->pNext = pTmp->pNext;
pTmp->pNext->pPri = pNode;
pNode->pPri = pTmp;
pTmp->pNext = pNode;

8、删除

pDel = pTmp-pNext;
pTmp->pNext = pDel->pNext;
pDel->pNext->pPri = pTmp;
free(pDel);
pDel = NULL;

Link.c
/*
**实现链表的创建、销毁、插入、删除、更新、遍历输出
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Link.h"

/*
**创建链表头节点
*/
Link* CreateLink()
{
    Link *phead = NULL;
    phead =(Link *)malloc(sizeof(Link));
    if (NULL == phead)
    {
        printf("create link fault !\n");
        return NULL;
    }
    memset(phead,0,sizeof(Link));
    return phead;
}
/*
**销毁
*/
int DestroyLink(Link *phead)
{
    if ( NULL == phead )
    {
        return LINK_ERR;
    }
    Link *pDel = NULL;
    Link *pTmp = NULL;
    pDel= phead->pNext;
    while(NULL != pDel)
    {
        pTmp = pDel->pNext;
        free(pDel);
        pDel = pTmp;
    }
    free(phead);
    phead = NULL;
    pDel = NULL;
    pTmp = NULL;
    return LINK_OK;

}

/*
**创建一个链表节点
*/
Link* CreateNode( data_t tdata )
{
    Link *pNode = NULL;
    pNode = (Link*)malloc(sizeof(Link));
    if ( NULL == pNode)
    {
        return pNode;
    }
    memset(pNode,0,sizeof(Link));
    pNode->data = tdata;
    return pNode;
}
/*
**首部插入一个链表的元素
*/
int InsertLinkItem(Link *phead,data_t idata,int Offset)
{
    if ( NULL == phead )
    {
        return LINK_ERR;
    }
    Link *pN = CreateNode(idata);
    Link *pTmp = phead;
    switch ( Offset )
    {
        case 0 :
            pN->pNext = phead->pNext;
            phead->pNext = pN;
            break;
      /*  case # :
            #
            break;*/
        default:
        while ( Offset--)
        {
            if ( NULL != pTmp->pNext)
            {
                pTmp = pTmp->pNext;
            }
        }
        pN->pNext = pTmp->pNext;
        pTmp->pNext = pN;

    }
    return LINK_OK;
}
/*
**链表的首部删除一个元素
*/
int DelLinkItem(Link *phead,data_t *pdata,int Offset)
{
    if ( (NULL == pdata) || (NULL == phead) || (NULL == phead->pNext))
    {
        return LINK_ERR;
    }
    Link *pT = phead->pNext;
    Link *pTmp = phead;
    Link *pDel = NULL;
    switch ( Offset )
    {
        case 0 :
            *pdata = pT->data;
            phead->pNext = pT->pNext;
            free(pT);
            pT = NULL;
            break;
        default:
            while ( Offset--)
            {
                if ( NULL != pTmp->pNext)
                {
                    pTmp = pTmp->pNext;
                }
            }
            pDel = pTmp->pNext;
            *pdata = pDel->data;
            pTmp->pNext = pDel->pNext;
            free(pDel);
            pDel = NULL;
    }
    return LINK_OK;
}
/*
**更新链表中的数据元素
*/
int UpdateLink(Link *phead,data_t OldData,data_t NewData)
{
    if ( NULL == phead)
    {
        return LINK_ERR;
    }
    Link *pTmp = phead->pNext;
    while ( NULL != pTmp)
    {
        if ( OldData == pTmp->data)
        {
            pTmp->data = NewData;
        }
        pTmp = pTmp->pNext;
    }
    return LINK_OK;
}

/*
**遍历链表输出链表元素的值
*/
void ShowLink(Link *phead)
{
    if ( NULL == phead)
    {
        return;
    }
    Link *pTmp = phead->pNext;
    while ( NULL != pTmp)
    {
        printf("%5d",pTmp->data);
        pTmp = pTmp->pNext;
    }
    printf("\n");
}

Link.h
#ifndef _LINK_H_
#define _LINK_H_

typedef int data_t;
typedef struct LINK
{
    data_t data;
    struct LINK *pNext;
}Link;

typedef enum LINK_OP
{
    LINK_ERR = -1,
    LINK_OK
}LINK_OP_ENUM;


Link* CreateLink();
int DestroyLink(Link *phead);
int InsertLinkItem(Link *phead,data_t idata,int Offset);
int DelLinkItem(Link *phead,data_t *pdata,int Offset);
int UpdateLink(Link *phead,data_t OldData,data_t NewData);
void ShowLink(Link *phead);
#endif /* _LINK_H_ */


main.c
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include"Link.h"

int main()
{
    Link *Ph = CreateLink();
    if ( NULL == Ph)
    {
        printf("create link failed\n");
        return -1;
    }
    int i = 0;
    int ret = -1;
    for ( i = 0 ; i < 10 ; i++ )
    {
        ret = InsertLinkItem(Ph, i,0);
        if ( LINK_ERR == ret)
        {
            break;
        }
    }
    ShowLink(Ph);
    ret = InsertLinkItem(Ph, 88,5);
    ShowLink(Ph);
    ret = InsertLinkItem(Ph, 99,20);
    ShowLink(Ph);
    int num = -1;
    ret = DelLinkItem(Ph, &num,0);
    ShowLink(Ph);
    ret = DelLinkItem(Ph, &num,3);
    ShowLink(Ph);
    ret = UpdateLink(Ph, 2, 0);
    ShowLink(Ph);
    DestroyLink(Ph);
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值