数据结构----单向链表基本操作(C语言描述)

#include<stdio.h>

typedef struct LNode{
    ElemType data;
    struct LNode *next; 
} LNode, *LinkList;

LinkeList CreatList1(LinkList &L)    //头插法建立单链表 
{
    LNode *s;
    int x; 
    L = (LinkList *)malloc(sizeof(LNode));    //动态分配内存空间 
    L->next = NULL;        //头节点指向空 
    scanf("%d",&x);
    while(x!=9999)
    {
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        s->next = L->next;    
        L->next = s;
        scanf("%d",&x);
    }
    return L;
}

LinkList *CreatList2(LinkList &L)    //尾插法建立单链表 
{
    LNode *s;
    LNode *r = L;
    int x;
    L = (LinkList *)malloc(sizeof(LNode));
    scanf("%d", &x);
    while(x!=9999)
    {
        s = (LNode *)malloc(sizeof(LNode));
        s->data = x;
        r->next = s;        //在r结点的后面插入 
        r = s;                //r指向s节点 
        scanf("%d", &x);
    }
    r->next = NULL;            //最后的节点一定要指向NULL 
    return L;
}

LNode *GetElem(LinkList L, int i)        //按序号i查找元素 
{
    int j = 1;
    LNode *p = L->next;        //初始化指针p为头指针 
    if(i==0)
    {
        return L;            //返回头节点 
    }    
    else if(i<1)
    {
        return NULL;        //情况不存在 
    }
    while(p&&j<i)
    {
        p = p->next;        //指针p向后指向 
        j++;                //计数器j往后移一位 
    }
    return p;                //返回当前节点 

LNode *LocateElem(LinkList L, ElemType e)    //按值查找节点 
{
    LNode *p = L->next;
    while(p != NULL && p->data != e) 
    {
        p = p->next;        //链表往后移动查找 
    }
    return p;
}

LNode *CountLength(LinkList L,int x)    //求单链表的长度 
{
    LNode *p = L->next;
    int i=0;
    while(1)
    {    
        p->next = p;
        i++;
    }
    return i;
}

void main()
{
    LinkList *p,*q,*s;        //s是待插节点,再定义一个临时节点p    
    /****前插法插入节点****/
    p = GetElem(L,i-1);        //找到i-1位置的节点 p (待插节点的前驱结点) 
    s->next = p->next;        // 将p的原指向转给s 
    p->next = s;            //p指向s,即s在p节点(i-1)位置的后面 i的位置 
    /****后插法插入节点****/ 
    p = GetElem(L,i);         //找到i位置的节点 p (待插节点的位置)
    s->next = p->next;        //交换指向 ,s节点就到了p节点(i位置)的后面i+1的位置 
    p->next = s;         
    int temp;                //用临时变量交换data值 
    temp = p->data;            //实现i和i+1位置节点值的交换 
    p->data = s->data;
    s->data = temp; 
    /****删除节点的操作****/ 
    p = GetElem(L,i-1);        //查找目标位置之前的节点p 
    q = p->next;            //q是目标删除节点 ,在p节点后面 
    p->next = q->next;        //断开链接 ,将q原指向直接由p节点指向 
    free(q);                //释放节点的存储空间 
    /****删除节点的骚操作****/
    p = GetElem(L,i-1);
    q = p->next;            //q指向*p节点的后继(i位置) 
    p->data = q->next->data;//将p的数据域和q节点的后继元素(i+1)的数据域交换 
    p->next = q->next;        //指针q的指向交给了p的指向,实现了断链 
    free(q);
}

猜你喜欢

转载自blog.csdn.net/qq_37504771/article/details/81433990