数据结构入门学习系列-5(链表的基本操作算法)

来源:互联网 发布:单片机读写sd卡 编辑:程序博客网 时间:2024/06/07 01:22

    链表的基本操作算法,直接参照部分代码:

    链表的创建,分为两种,一种是队尾插入,一种是队头插入:

    

typedef struct LNode {    ElemType data;    struct LNode *next;} LNode;//创建链表(头插入法)LNode *create_LinkList_Head(){    int data;    LNode *head, *p;    head = (LNode *)malloc(sizeof(LNode));    head->next = NULL;//创建头结点    while(1){        scanf("%d",&data);        if(data == 32767)            break;        p->data = data;        p->next = head->next;        head->next = p;    }    //钩链,新建的节点是头结点    return head;}//创建链表(尾插入法)Lnode *create_LinkList_Tail(){    int data;    LNode *head, *p ,*q;    head = q = (LNode*)malloc(sizeof(LNode));    q->next =NULL;    while(1){        scanf("%d",&data);        if(data == 32767)            break;        p = (LNode*)malloc(sizeof(LNode));        p->data= data;        p->next = q->next;        p=q->next;        q=p;        //钩链,新建的节点是最后一个节点    }    return head;} 

    对于单链表,如果没有明确指出直接后继,那么钩链的次序必须是:先右后左。

    对于单链表的查找同样有两种方式:按照位置查找和按照值来查找。

    首先来看按照位置查找:

//按照序号查找ElemType Get_Elem(LNode *l,int i){    int j = 0;    LNode *p;    p=l->next;    for(j=0;j<i;j++){        if(p->next = NULL)        return ERROR;        p=p->next;    }    return p->data;}
    链表不像之前的顺序表,直接按照位置i就能找到相应的元素,而是需要从链表的头出发,依次查找,直到找到对应的元素为止。就查找来说,单链表的复杂度比顺序存储表时间度要复杂。

    按照值来查找:

//按照值查找LNode *Get_Position(LNode *l, ElemType key){    LNode *p;    for( p=l->next;p;p=p->next){        if(key == p->data)           return p;    }    return NULL;}
    按照值来查找,也是同样需要从链表的头结点出发,依次比较:

//按照值查找LNode *Get_Position(LNode *l, ElemType key){    LNode *p;    for( p=l->next;p;p=p->next){        if(key == p->data)           return p;    }    return NULL;}
单链表的插入需要知道插入位置和插入元素,之前介绍过链表的一些钩链操作。其实插入就是先查找,再钩链的过程。具体可以参照如下code:

//链表插入元素e到i位置void Insert_ElemType(LNode *l, int i, ElemType e){    LNode *p = l->next;    for(int j=0;j<i;j++)    {        if(p==NULL)            return NULL;        p = p->next;    }    LNode q = (LNode *)malloc(sizeof(LNode));    q->data = e;    q->next = p->next;    p->next = q;}
同样,删除操作就是先查找再断链,然后释放的过程。切记删除元素一定要释放内存:

//按位置序号删除元素void Delete_ElemType(LNode *l,int i){    LNode *p=l;    LNode *q=l->next;    for(int j=0;j<i;j++)    {        if(p==NULL)            return NULL;        p=q;        q = q->next;    }    p->next = q->next;    free(q);}//按照值删除元素void Delete_Elem(LNode *l, ElemType e){    LNode *p=l;    LNode *q=l->next;    for( ;p;p->next) {       p = q;       q = q->next;       if(p->data == key)        break;    }    p->next = q->next;    free(q);}





阅读全文
0 0