数据结构——单链表相关知识

1、创建一个单链表
实现思路:首先,定义一个头结点(*L),为其在内存中开辟一段空间并将指针域指针指向NULL;其次,生成一个新结点p,将要插入的数据元素存储到结点的数据域,并将其指针域指针指向头结点(*L)指向的结点(或NULL);最后,将新结点p插入到表头。

/***
    随机产生n个元素的值,建立带头结点的单链线性表L(头插法)***/
//单链表节点的定义
typedef struct{
    int data;
    struct Node* next;
}Node;
//由一个数组创建单链表
Node* CreateList(int *a, int count)
{
    if(NULL == a)
        return NULL;
    //头结点:开辟空间,赋值数据域、指针域
    Node* head = (Node*)malloc(sizeof(Node));
    head->data= a[0];
    head->next = NULL;
//将链表的头结点赋值给指针变量p
Node* p = head;
for (int i = 1; i < count; ++i)
{
    p->next = (Node*)malloc(sizeof(Node));
    p->next->data= a[i];
    p->next->next = NULL;
    p = p->next;
}
 return head;    //返回链表

}
2、单链表插入
实现思路:首先,对链表进行查询操作,找到第i个位置;其次,为新插入的结点s在内存中开辟一段存储空间并将插入的元素存储到新结点s的数据域中;最后,将p指向的结点位置赋值给新结点s的指针域,再将新结点s的存储地址赋值给工作指针。

/*功能:将元素e插入到单链表的第i个位置*/
#define UNSUCCESS -1
#define SUCCESS 1
typedef Status int;
Status ListInsert(LinkList *L,int i,ElemType e)
{
    int j=1;
    LinkList p,s;              //声明一个结点p
    p=*L;             //让结点p指向链表L的第一个结点
    while(p&&j<i) {     //从链表第一个结点开始遍历,直到j=i-1,让p指向存储i-1位置所在的结点
        p=p->next;         //让p指向下一个结点
        ++j;
    }
    if(!p || j>i)        //当p指向null或者j大于要查询的位置时,查询失败
        return UNSUCCESS ;
   s=(LinkList)malloc(sizeof(Node));    //生成新结点,即为新结点开辟一段内存
   s->data=e;        //查找成功,将数据元素e赋值给s结点的数据域
   s->next =p->next;//将结点p的后继结点赋值给s的后继(p->next为指向结点p下一个存储地址所在的结点)
   p->next=s;        //设置结点p的后继结点为结点s
    return SUCCESS ;
}

3、单链表删除操作
实现思想:首先,声明一个结点q并对链表进行查询操作,找到第i个位置;其次,将第i个结点赋值给q;第三,将q的后继(以前的p的后继)赋值为工作指针p的后继;最后,将第i个结点(q)数据域数据存储到指针变量e中,free(q)即释放结点q占用的内存空间

/***功能:删除单链表L中的第i个数据元素(结点)
            并将该数据元素存储到指针变量e指向的存储空间中***/
#define UNSUCCESS -1
#define SUCCESS 1
typedef Status int;
Status ListInsert(LinkList *L,int i,ElemType *e)
{
    int j=1;
    LinkList p,q;        //声明一个结点p
    p=*L;        
    //从链表第一个结点开始遍历,直到j=i-1,让p指向存储i-1位置所在的结点
    while(p->next&&j<i)     
    {
        p=p->next;     //让p指向下一个结点
        j++;
    }
    if(!p || j>i)
        return UNSUCCESS;
    q=p->next;            //设置q为p的后继结点,即将第i个结点的地址保存到q
    p->next=q->next;   //将q的后继结点设置为p的后继结点
    *e=q->data;    //将q结点中的数据给e
    free(q);           //设置完成后,让系统回收此结点,释放内存
    return SUCCESS;
}

。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值