(一)顺序表和单链表的初始化、插入、删除等操作

线性表

定义
#define  MAXSIZE 20   //线性表最长长度
typedef int ElemType; //数据类型
typedef struct{
    ElemType data[MAXSIZE];
    int length;
}SqList;
函数说明
/**
 * 顺序表
 * InitList(*L) 初始化
 * ListEmpty(L) 若为空,返回true
 * ClearList(*L) 清空
 * GetElem(L,i,*e) 第i个位置元素返回给e
 * LocateElem(L,e) 查找与e相同的元素,返回元素在表中序号
 * ListInsert(*L,i,e) 第i个元素之前插入元素
 * ListDelete(*L,i,*e) 删除L的第i个数据
 * * @return
 */

函数部分
int i;

Status InitList(SqList *L){
    L->length = 0;
    for(i = 0;i < MAXSIZE; i++){
        L->data[i] = i;
        L->length++;
    }
    return OK;
}

Status Output(SqList *L){
    for(i = 0; i < MAXSIZE; i++){
        printf("%d ",L->data[i]);
    }
    printf("L->length:%d\n",L->length);
    return OK;
}

Status GetElem(SqList L,int i,ElemType *e){
    *e = L.data[i-1];
    return OK;
}

Status LocateElem(SqList L,ElemType e){
    for(int i = 0; i < MAXSIZE; i++){
       if(L.data[i]==e){
           return i;
       }
    }
    return FALSE;
}

Status ListInsert(SqList *L,int i,ElemType e){
    int k;
    if(L->length == MAXSIZE)
        return ERROR;
    if(i < 1 || i > L->length+1)
        return ERROR;
    if(i<=L->length){
        for(k = L->length-1;k>=i-1;k--)
            L->data[k+1] = L->data[k];
    }
    L->data[i-1] = e;
    L->length++;
    return OK;
}

Status ListDelete(SqList *L,int i,ElemType *e){
    int k;
    if(L->length == 0)
        return ERROR;
    if(i<1 || i>L->length)
        return ERROR;
    *e = L->data[i-1];
    if(i<L->length){
        for(k=i;k<L->length;k++)
            L->data[k-1] = L->data[k];
    }
    L->length--;
    return OK;
}

main函数
int main() {

    int i = 0;
    ElemType e;
    //定义L
    SqList L;
    //初始化L
    InitList(&L);
    //输出L
    Output(&L);

    //第i个位置元素返回给e
    printf("请输入i的值:");
    scanf("%d",&i);
    GetElem(L,i,&e);
    printf("e的值是:%d\n",e);

    //查找与e相同的元素,返回元素在表中序号
    printf("请输入e的值:");
    scanf("%d",&e);
    int j = LocateElem(L,e);
    if(j==FALSE){
        printf("没有与e相同的元素");
    }else{
        printf("元素在表中的序号是:%d\n",j);
    }

    //删除L的第i个数据
    printf("请输入要删除第几个数据:");
    scanf("%d",&i);
    ListDelete(&L,i,&e);
    printf("删除后的线性表:");
    Output(&L);

    //第i个元素之前插入元素
    printf("请输入i的值:");
    scanf("%d",&i);
    printf("请输入要插入输的值");
    scanf("%d",&e);
    ListInsert(&L,i,e);
    printf("插入后的线性表:");
    Output(&L);

    return 0;
}

单链表

定义

typedef int  ElemType;
typedef struct Node{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;

函数说明

/**
 * 单链表
 * InitLinkList(L) 初始化L
 * OutputLinkList(L) 输出L
 * LinkedListCreateH 头插法
 * LinkedListCreateT 尾插法
 * Length(L) 长度
 * GetElem(L,i,*e) 获取第i个元素值
 * ListInsert(L,i,e) 在i个节点之前插入新的数
 * ListDelete(L,i,*e) 删除第i个节点
 * ClearList(L)
 * @return
 */

函数部分

LinkList InitLinkList(){
    LinkList L;
    L = (LinkList)malloc(sizeof(Node));
    if(L==NULL)
        printf("空间分配失败");
    L->next = NULL;
    return L;
}

//头插法
LinkList LinkedListCreateH(LinkList L){
    ElemType x;
    for(int i=0;i<5;i++){
        printf("请输入第%d个数据:",i+1);
        scanf("%d",&x);
        LinkList p;
        p = (LinkList)malloc(sizeof(Node));
        p->data = x;
        p->next = L->next;
        L->next = p;
    }
    return L;
}

//尾插法
LinkList LinkedListCreateT(LinkList L){
    LinkList r;
    r = L;
    while(r->next){
        r = r->next;
    }
    ElemType x;
    for (int i = 0; i < 5; i++) {
        printf("请输入第%d个数据:",i+1);
        scanf("%d",&x);
        LinkList p;
        p = (LinkList)malloc(sizeof(Node));
        p->data = x;
        r->next = p;
        r = p;
    }
    r->next = NULL;

    return L;
}


Status OutputLinkList(LinkList L){
    LinkList p = L->next;
    while(p!=NULL){
        printf("%d ",p->data);
        p = p->next;
    }
    return OK;
}

Status Length(LinkList L){
    int length = 0;
    LinkList p;
    p = L->next;
    while(p){
        p = p->next;
        length++;
    }
    return length;
}

Status GetElem(LinkList L,int i,ElemType *e){
    int j;
    LinkList p;
    p = L->next;
    j = 1;
    while (p && j<i){
        p = p->next;
        ++j;
    }
    if(!p || j>i)
        return ERROR;
    *e = p->data;
    return OK;
}

LinkList ListInsert(LinkList L,int i,ElemType e){
    int j;
    LinkList p,s;
    p = L;
    j = 1;
    while (p && j<i){
        p = p->next;
        ++j;
    }
    if(!p || j>i)
        return ERROR;
    s = (LinkList)malloc(sizeof(Node));
    s->data = e;
    s->next = p->next;
    p->next = s;

    return L;
}

LinkList ListDelete(LinkList L,int i,ElemType *e){
    int j;
    LinkList p,q;
    p = L;    //一开始p是指向头指针的,所以数值为空
    j = 1;
    while(p->next && j<i){
        p = p->next;
        ++j;
    }
    if(!(p->next)||j   >i)
        return  ERROR;
    q = p->next;
    p->next = q->next;
    *e = q->data;
    free(q);
    return L;
}

LinkList ClearList(LinkList L){
    LinkList p,q;
    p = L->next;
    while(p){
        q = p->next;
        free(p);
        p = q;
    }
    L->next = NULL;
}

Status IsClear(LinkList L){
    LinkList p;
    p = L;
    if(p->next==NULL)
        return OK;
    else
        return FALSE;
}

main函数

int main() {
    //初始化
    LinkList L = InitLinkList();
    //头插法
    LinkedListCreateH(L);
    //输出
    OutputLinkList(L);
    //尾插法
    LinkedListCreateT(L);
    //输出
    OutputLinkList(L);
    //长度
    int length = Length(L);
    printf("L长度是:%d\n",length);

    int i;
    ElemType e;
    printf("请输入要获取第几个元素的值:");
    scanf("%d",&i);
    GetElem(L,i,&e);
    printf("第%d个元素的值是:%d\n",i,e);

    printf("请输入要在第几个数据之前插入:");
    scanf("%d",&i);
    printf("请输入要插入的值:");
    scanf("%d",&e);
    ListInsert(L,i,e);
    //输出
    OutputLinkList(L);

    printf("请输入要删除第几个数值:");
    scanf("%d",&i);
    ListDelete(L,i,&e);
    //输出
    OutputLinkList(L);

    ClearList(L);
    printf("线性表是否清除:%d\n",IsClear(L));

    return 0;
}












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值