单链表存储结构创建、插入、删除操作 《大话数据结构》 c++代码实现

 

#include<iostream>
#include<stdio.h>
#include<ctime>

using namespace std;

//线性表链式存储的结构代码
#define ok 1
#define error 0

typedef int Elemtype;
typedef int status;

//定义
typedef struct Node
{
    Elemtype data;
    struct Node *next;
}Node;
typedef struct Node* linklist;

//这是定义一个结构体,这个结构体有两个属性,一个是int类型的data; 另一个是这个结构体本身类型的指针next;
//给这个结构定义了一个指针别名:LinkList;
//Node a; 声明一个struct Node结构体类型的结构体变量a;
//LinkList b; 等价于 struct Node* b; 等价于 Node *b; 声明一个struct Node结构体类型的指针变量 b;


//操作
void Creatlistheadz(linklist *L,int n);
void Creatlisttail(linklist *L,int n);
status Clearlist(linklist *L);
status Listinsert(linklist *L,int i,Elemtype e);
status Listdelete(linklist *L,int i,Elemtype *e);
void Inputlist(linklist L);


//单链表整表创建(头插法)
void Creatlistheadz(linklist *L,int n)
{
    linklist p;
    int i;
    srand(time(0));
    *L=(linklist)malloc(sizeof (Node));
    (*L)->next=NULL;   //建立一个带头结点的单链表    
    for(i=0;i<n;i++)
    {
        p=(linklist)malloc(sizeof(Node));
        p->data=rand()%100+1;
        p->next=(*L)->next;
        (*L)->next=p;
    }
}

 

//单链表整表创建(尾插法)
void Creatlisttail(linklist *L,int n)
{
    linklist p,r;
    int i;
    srand(time(0));
    *L=(linklist)malloc(sizeof (Node)); //建立一个带头结点的单链表  
    r=*L;  //r为指向尾部的结点

注意:*L和r的区别,一个是链表,一个是结点

    for(i=0;i<n;i++)
    {
        p=(linklist)malloc(sizeof(Node));
        p->data=rand()%100+1;
        r->next=p;
        r=p;
    }
    r->next=NULL;
}

//删除单链表
status Clearlist(linklist *L)
{
    linklist p,q;
    p=(*L)->next;   //p指向第一个结点
    while(p)
    {
        q=p->next;
        free(p);
        p=q;
    }
    (*L)->next=NULL;   //头结点的指针域为空
    return ok;
}
//获得元素
status Getelem(linklist L,int i,Elemtype *e)
{
    int j;
    linklist p;
    p=L->next;
    j=1;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        return error;
    *e=p->data;

    return ok;
}


//插入算法
status Listinsert(linklist *L,int i,Elemtype e)
{
    int j;
    linklist p,s;
    p=*L;
    j=1;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        return error;

    s=(linklist)malloc(sizeof(Node));
    s->data=e;

    s->next=p->next;
    p->next=s;
    return ok;
}

//删除算法
status Listdelete(linklist *L,int i,Elemtype *e)
{
    int j;
    linklist p,q;
    p=*L;
    j=1;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        return error;
    q=p->next;
    p->next=q->next;

    free(q);    //回收节点,释放内存
    return ok;
}

void Inputlist(linklist L)
{
    linklist p;
    p=L->next;
    int i=1,a;
    while(p)
    {
        a=p->data;
        cout<<"第"<<i<<"个结点的值为:"<<a<<endl;
        p=p->next;
        i++;
    }
}


int main()
{
     linklist L;
     int e=0;
     int b=20;
     cout<<"创建一个新的单链表:"<<endl;
     Creatlistheadz( &L,10);
     Inputlist(L);

     cout<<"添加一个新的结点后单链表为:"<<endl;
     Listinsert(&L,6,b);
     Inputlist(L);

     cout<<"删除一个结点后单链表为:"<<endl;
     Listdelete(&L,8,&e);
     Inputlist(L);

     cout<<"--------------------------"<<endl;
     Getelem(L,5,&e);
     cout<<"e="<<e<<endl;

    system("pause");
    return 0;
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希表是一种高效的数据结构,它能够在平均情况下以常数时间O(1)进行插入删除和查找操作。在C语言中,我们可以使用哈希表来解决一些常见的问题,比如查找一个元素或者统计元素出现的频率。 在实现哈希表时,我们需要以下几个关键组成部分: 1. 哈希函数:哈希函数将输入的数据映射到哈希表中的某个位置,它应该具备良好的分布性,即使数据分布不均匀,也能使得元素尽可能均匀地散列到不同的槽位中。 2. 数组:哈希表通常使用一个数组来存储数据,数组的大小可以根据实际情况进行调整。每个槽位可以存储一个元素或者一个指向链表/红黑树等数据结构的指针,用于解决哈希冲突。 3. 冲突处理:由于不同的元素可能被映射到相同的槽位上,所以我们需要解决冲突的问题。常见的解决方法有开放地址法和链地址法。开放地址法会寻找下一个可用的槽位,直到找到一个空闲位置,而链地址法则使用链表或其他数据结构将冲突的元素串联起来。 使用C语言实现哈希表时,我们可以先定义一个结构体来表示哈希表的每个槽位,然后使用数组来存储这些结构体。结构体可以包含键值对等信息,以及指向下一个元素的指针(用于链地址法)。然后,我们可以根据需要实现插入删除和查找等操作,使用哈希函数将元素映射到相应的位置,并根据具体的冲突处理方式解决冲突。 总之,哈希表是一种非常实用的数据结构,它在处理大量数据时能够提供高效的查找和操作效率。在C语言中,我们可以根据具体需求实现自己的哈希表,或者使用已有的开源库来简化开发过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值