数据结构--单链表

本节代码例子下载:http://pan.baidu.com/share/link?shareid=2658223183&uk=3189484501



单链表的特点

1.用一组 任意的存储单元存储线性表中的数据元素,这组存储单元 可以是连续的,也可以是不连续的
2.链表中结点的逻辑次序和物理次序 不一定相同,为了能正确反映结点间的逻辑关系,在存储每个结点值的同时,还 必须存储其后继结点的地址信息。(因为物理顺序不同,所以在每个存储的数据后面留出一小块空间存储下一个逻辑结点的地址)
3.存放数据元素的结点至少包括两个域,一个域放该元素的数据,称为 数据域(data),另一个域存放后继结点在存储器中的地址,称为 指针域链域(next),这种链式分配的存储结构称为 链表

左面数据域,右面指针域
      data             next


如果一个结点只有一个指针域,称为 单链表(Single Linked List)
如果一个节点有两个指针域,除了数据域后面的指向后继结点的指针域外,在数据域前面还有一个指向前趋结点的指针域,则称为 双链表

在单链表的一个结点之前增加一个结点(头结点)称为带头结点的链表,此头结点的数据域不用。


struct ListNode          //定义链表中的结点
{
    DataType data;
    ListNode* next;
};
typedef ListNode* LinkList;          //给ListNode*起别名为LinkList 
//初始化
void InitList(LinkList* _pHead)
{
    *_pHead=NULL;
}
//求表长
int ListLength(LinkList li)
{
    int nLength=0;
    while(li!=NULL)
    {
        li=li->next;
        nLength++;
    }
    return nLength;
}
//取链表L中的第i个结点
LinkList GetNode(LinkList pList,int i)
{

    if(i<0)
        return NULL;
    for (int j=0;j<i;j++)
        pList=pList->next;
    return pList;
}
// 查找结点
int LocateNode( LinkList li, DataType x)
{
    int nPoint=0;
    while (li&&li->data!=x)
    {
        li=li->next;
        nPoint++;
    }
    if(li)
        return nPoint;
    else
        return -1;
}
//插入结点
void InsertList(LinkList *_pL,DataType _x,int _i)  //包括两种,头指针为空和插入0前面
{
LinkList temp=(ListNode*)malloc(sizeof(ListNode));
temp->data=_x;
int nLen=ListLength(*_pL);
LinkList p;
if(_i>=nLen)
p=GetNode(*_pL,nLen-1);
else
p=GetNode(*_pL,_i-1);

if(0>=_i||NULL==*_pL)
{
temp->next=*_pL;
*_pL=temp;
return true;
}
else  //两个结点中间插入和插入最后一个位置
{
` temp->next=p->next;
p->next=temp;
}

}
//删除结点
bool DeleteList(LinkList* _pL,int i)
{
LinkList  pNode=NULL;
ListNode* p=NULL;
if(i<0||i>ListLength(*_pL)-1)
return false;
if(0==i)
{
p=*_pL;
*_pL=(*_pL)->next;
}
else
{
pNode=GetNode(*_pL,i-1);
p=pNode->next;
pNode->next=p->next;
}
free(p);
p=NULL;
return true;
}
int _tmain(int argc, _TCHAR* argv[])
{
    LinkList pHead;  //LinkList类型的指针变量pHead表示它是单链表的头指针指向链表的第一个结点
    LinkList pNode; //定义一个指向结点的指针当最后一个结点没有后继结点因此把最后的指针设为空

     InitList(&pHead);

    _getch();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

杜甲同学

感谢打赏,我会继续努力

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

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

打赏作者

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

抵扣说明:

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

余额充值