链表

#include<string.h>
#include<malloc.h> /* malloc()等 */
#include<stdio.h> /* EOF(=^Z或F6),NULL */
#include<stdlib.h> /* atoi() */
#include<math.h> /* floor(),ceil(),abs() */
/* 函数结果状态代码 */
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
/* #define OVERFLOW -2 因为在math.h中已定义OVERFLOW的值为3,故去掉此行 */
typedef int Status; /* Status是函数的类型,其值是函数结果状态代码,如OK等 */
typedef int Boolean; /* Boolean是布尔类型,其值是TRUE或FALSE */
typedef int ElemType;        // 定义元素的类型为整型


//定义链表
struct LNode
{
    ElemType data;
    struct LNode *next;
};
typedef struct LNode *LinkList; /* 另一种定义LinkList的方法 */


//返回第i个元素
Status GetElem(LinkList L,int i,ElemType *e) 
{
    /* L为带头结点的单链表的头指针。当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR */
    int j=1; /* j为计数器 */
    LinkList p=L->next; /* p指向第一个结点 */
    while(p&&j<i) /* 顺指针向后查找,直到p指向第i个元素或p为空 */
    {
        p=p->next;
        j++;
    }
    if(!p||j>i) /* 第i个元素不存在 */
        return ERROR;
    *e=p->data; /* 取第i个元素 */
    return OK;
}


//在第i个位置插入e
Status ListInsert(LinkList L,int i,ElemType e)
{
    /* 在带头结点的单链线性表L中第i个位置之前插入元素e */
    int j=0;
    LinkList p=L,s;
    while(p&&j<i-1) /* 寻找第i-1个结点 */
    {
        p=p->next;
        j++;
    }
    if(!p||j>i-1) /* i小于1或者大于表长 */
        return ERROR;
    s=(LinkList)malloc(sizeof(struct LNode)); /* 生成新结点 */
    s->data=e; /* 插入L中 */
    s->next=p->next;
    p->next=s;
    return OK;
}


//第i个元素,并由e返回其值
Status ListDelete(LinkList L,int i,ElemType *e) 
{
    /* 在带头结点的单链线性表L中,删除第i个元素,并由e返回其值 */
    int j=0;
    LinkList p=L,q;
    while(p->next&&j<i-1)  /*寻找第i个结点,并令p指向其前趋 */
    {
        p=p->next;
        j++;
    }
    if(!p->next||j>i-1) /* 删除位置不合理 */
        return ERROR;
    q=p->next; /* 删除并释放结点 */
    p->next=q->next;
    *e=q->data;
    free(q);
    return OK;
}


// 显示链表中的元素,返回值为链表元素的数目
int ShowList(LinkList L)
{
    int numOfList = 0;                // 记录链表中元素的数目
    LinkList p = L->next;        // 用来遍历链表元素的指针
    while(p)                                 // 如果该结点不为空
    {
        if(numOfList)                 // 如果该元素不是列表中的第一个元素(先判断值是否为0,然后加1)
        {
            putchar(' ');
        }
        numOfList++;                // 元素的数目加1
        printf("%d",p->data);        // 输出元素
        p = p->next;                // 指针向后移动
    }
    if(numOfList == 0)                 // 如果链表中的元素数目为0,说明是空链表
    {
        return 0;
    }
    else
    {
        putchar('\n');                // 注意换行
        return numOfList;        // 返回链表中元素的数目
    }
}


害羞

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值