C语言数据结构(1)

1.C的函数书写

        一般格式如下:

         返回值类型  方法名(形参列表)    //函数头

         {

              函数体;                    //一条或多条C语句

         }

        举个简答的例子:

    int Max(int a, int b)
    {
        if(a > b)
            return a;
        else
            return b;
    }
        
        

2、线性表

2.1 定义

        线性表是具有相同特性数据元素的一个有限序列。所含元素的个数叫做线性表的长度n。n=0时为空表。

2.2 存储结构

        有顺序存储和链式存储两种,故线性表分为顺序表和链表两种。

        顺序表和链表的区别为:

        (1)基于空间的比较

                1)存储分配的方式:顺序表是一次性分配,链表是多次分配。

                2)存储密度: 顺序表是1,链表小于1。

        (2)基于时间的比较

                1)存取方式:顺序表可随机也可顺序,而链表只能顺序存取。

                2)插入/删除移动个数:顺序表平均需要移动一半元素,链表不需要移动元素,只需要修改指针。

2.3 顺序表的CURD算法

2.3.1按元素值的查找算法

        

int SelectElem (SqlList L , int a)
{
    int i;
    for(i=0;i<L.length;i++)
        if(a==L.data[i])
            return i;
        return -1;    //没找到,返回-1作为失败标记
}

2.3.2插入数据元素的算法

int insertElem(SqlList &L , int p , int b)  //L本身发生改变,用引用型
{
    int i;
    if(p<0||p>L.length||L.length==maxSize)
        return 0;    //失败返回0
    for(i=L.length-1;i>p;--i)
        L.data[i+1] =L.data[i];
    L.data[p] = b;
    ++(L.length);    //表内元素+1,表长自增1
    renturn 1;        //插入成功,返回1
}

2.3.3 删除算法

       

int deleteElem(SqlList &L, int p, int &e) //需要改变的变量用引用型
{
    int i;
    if(p<0||p>L.length-1)
        return 0;
    e=L.data[p];    //将要被删除的元素赋值给e
    for(i=p;i<L.length-1;++i)
        L.data[i] = L.data[i+1];
    --(L.length);
    return 1;
}

2.4 单链表的操作

2.4.1 单链表的归并操作

        A和B是两个元素递增有序的单链表(含头结点),将A和B归并成一个元素值非递减有序的链表C,采用尾插法。

void merge(LNode *A, LNode *B, LNode *&C)
{
    LNode *P = A->next;        //用p来追踪A的最小值结点,A->next表示A链表的开始结点,A是递增的,故为最小值结点
    LNode *q = B->next;        //用q追踪B的最小值结点
    LNode *r;            
    C=A;                       //用A的头结点来做C的头结点
    C->next = null;            //表示C只取A的头结点,其余为空
    free(B);                   //释放无用的B的头结点
    r = C;                     //r指向C,此时头结点也是终端结点
    while(p!=null||q!= null)   //当p、q都不为空时,取p和q所指结点中的较小值插入C的尾部
    {
        if(p->data<=q->data)   //if语句中r始终指向C的终端结点,新结点被链接入C并重新指向新的终端结点
        {
            r->next=p;
            p=p->next;
            r=r->next;        
        }else
        {
            r->next=q;
            q=q->next;
            r=r->next;  
        }
    }
    r->next =NULL;
    if(p!=NULL)r->next=p;
    if(q!=NULL)r->next=q;
}

2.4.2 建立单链表

        尾插法:

void createlistR(LNode *&C, int a[], int n)
{
    LNode *s,*r;
    int i;
    C=(LNode *)malloc)(sizeod(LNode));        //申请C的头结点空间
    C->next=NULL;
    r=C;                    //尾指针r指向头结点
    for(i=0;i<n;++i)
    {
        s=(LNdoe *)malloc(sizeof(LNode));    //生成新结点
        s->data=a[i];       
        r->next=s;        //用r接纳新结点
        r=r->next;        //r始终指向终端结点,以便接纳下一个到来的结点
    }
    r->next=NULL;         //数组a的所有元素已装入C中,C的终端结点为空,C建立完成
}

        头插法:

        

void createlist1(LNode *&C,int a[],int n)
{
    LNode *s;
    int i;
    C=(LNode *)malloc(sizeof(LNode));
    C->next=NULL;
    for(i=0;i<n;++i)
    {
        s=(LNode *)malloc(sizeof(LNode));
        s->data=a[i];
        s->next =C->next;
        C->next=s;
    }
}

        

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值