单链表实现及操作 数据结构C语言版

单链表实现及操作


相关操作的函数传递运用了C++的引用

初始定义

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;
typedef int ElemType;

//类型定义

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

单链表创建并初始化

头插法

void CreateList_L1(LinkList &L,int n){//带头结点的单链表(头插法) L为头结点 n为元素个数
    LinkList p;
    L = (LinkList)malloc(sizeof(LNode));	//为分配头结点空间
    L->next = NULL;
    for(int i=0;i<n;i++){
        p = (LinkList)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        //核心代码
        p->next = L->next;	
        L->next = p;
    }
}

尾插法

void CreateList_L2(LinkList &L,int n){//带头结点的单链表(尾插法) L为头结点 n为元素个数
    LinkList p,tail;
    L = (LinkList)malloc(sizeof(LNode));
    L->next = NULL;//初始化为空链表
    tail = L;//tail为尾指针
    for(int i = 0;i<n;i++){
        p = (LinkList)malloc(sizeof(LNode));
        scanf("%d",&p->data);
        //核心代码
        tail->next = p;
        tail = p;
    }
    tail->next = NULL;	//最后结点的next置空
}

获取单链表的长度

int GetLength_L(LinkList L){//获取单链表的长度 传参为头结点
    LinkList p = L->next;
    int len = 0;
    while(p){	//当p!=NULL时
        len++;
        p = p->next;	//指向下一结点
    }
    return len;	//返回单链表长度
}

单链表遍历输出

void OutputList_L(LinkList L){//单链表输出
    LinkList p;
    p = L->next;
    while(p!=NULL){	//p!=NULL时
        printf("%d  ",p->data);	
        p = p->next;	//指向下一结点
    }
}

判断是否为空

Status ListEmpty_L(LinkList L){//判断单链表是否为空
    if(L->next==NULL)
        return TRUE;
    else
        return FALSE;
}

获取元素操作

获取第i个元素值 并用e接收

Status GetElem_L(LinkList L,int i,int &e){//获取第i个元素 其值赋给e 返回OK
    LinkList p;
    p = L->next;
    int j = 1;//j为计数器
    //if(p)等价于p!=NULL if(!p)等价于p==NULL
    while(p&&j<i){	//遍历到第i个元素位置
        p = p->next;
        j++;
    }
    if(!p||j>i){	//不符合条件
        return ERROR;
    }
    e = p->data;	//取第i个元素
    return OK;
}

删除操作

删除第i个元素 用e返回其值

Status ListDelete_L(LinkList &L,int i,int &e){//在带头结点的单链线性表L中 删除第i个元素 并由e返回其值
    LinkList p;
    p = L->next;
    int j = 1;
    while(p->next&&j<i-1){	//寻找第i-1个结点
        p = p->next;
        j++;
    }
    if(!(p->next)||j>i-1){	//不存在元素或p->next = NULL
        return ERROR;
    }
    LinkList q;	
    q = p->next;	//应删除位置
    p->next = q->next;	//调整删除元素前后位置的指针
    e = q->data;	//用e返回删除元素
    free(q);
    return OK;
}

插入操作

在单链表的第i个位置之前插入元素e

Status ListInsert_L(LinkList &L,int i,int e){
    LinkList p;
    p = L->next;
    int j = 1;
    //这里也可以写为:p = L; int j = 0;
    while(p&&j<i-1){	//寻找第i-1个结点
        p = p->next;
        j++;
    }
    if(!p||j>i-1){
        return ERROR;
    }
    LinkList s;
    s = (LinkList)malloc(sizeof(LNode));	//为增加元素分配空间
    s->data = e;
    //插入核心代码
    s->next = p->next;
    p->next = s;
    return OK;
}

整表删除

Status ClearList_L(LinkList &L){//单链表的整表删除
    LinkList p,q;
    p = L->next;	//指向头结点的下一节点
    while(p){	//p不为NULL时
        q = p->next;
        free(p);	//释放结点
        p = q;
    }
    L->next = NULL;	//将头结点的next指针置NULL
    return OK;
}

——————END——————

作者注:

记录学习,分享经验。
有兴趣可以关注博主,以后还会持续更新内容哦~
上一篇:考研数据结构算法题day20-24


下一篇:jquery简单原则器(匹配第一个元素)