线性表的链式存储结构(完整代码(C语言)+运行实例)

代码如下:

#include <stdio.h>
#include <stdlib.h>
#define ERROR 0
#define OK 1
typedef int Status;
typedef int ElemType;
typedef struct Node{
    ElemType data;
    struct Node *next;
}Node;
typedef struct Node *LinkList;
//表的创建(头插法)
void CreateListHead(LinkList *L,int m[],int n){
    LinkList p;
    int i;
    *L=(LinkList)malloc(sizeof(Node));
    (*L)->next=NULL;
    for(i=0;i<n;i++){
        p=(LinkList)malloc(sizeof(Node));
        p->data=m[i];
        p->next=(*L)->next;
        (*L)->next=p;
    }
}
//表的创建(尾插法)
void CreateListTail(LinkList *L,int m[],int n){
    LinkList p,r;
    int i;
    *L=(LinkList)malloc(sizeof(Node));
    r=*L;
    for(i=0;i<n;i++){
        p=(Node *)malloc(sizeof(Node));
        p->data=m[i];
        r->next=p;
        r=p;
    }
    r->next=NULL;
}
//获取元素的操作
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;
}
//插入元素的操作
Status 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 OK;
}
//删除元素的操作
Status ListDelete(LinkList *L,int i){
    int j;
    LinkList p,q;
    p=*L;
    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;
    free(q);
    return OK;
}
Status Output(LinkList L){
    LinkList p;
    p=L->next;
    while(p){
        printf("%d ",p->data);
        p=p->next;
    }
    printf("\n");
}
int main(){
    LinkList L;
    int i,k,j,n,e,m[1000];
    printf("请输入要存储元素的总个数:");
    scanf("%d",&n);
    printf("请输入各个元素的值:");
    for(i=0;i<n;i++){
        scanf("%d",&m[i]);
    }
    CreateListTail(&L,m,n);
    printf("此时链表的各元素如下:\n");
    Output(L);
    printf("请输入要获取第j个元素并返回到e值中(输入j的值):");
    scanf("%d",&j);
    GetElem(L,j,&e);
    printf("此时e的值为第j个元素值:%d\n",e);
    printf("请输入在第k个元素前插入一个元素e1:");
    int e1;
    scanf("%d%d",&k,&e1);
    ListInsert(&L,k,e1);
    printf("此时链表的各元素如下:\n");
    Output(L);
    printf("请输入要删除链表中的第几个元素:");
    int l;
    scanf("%d",&l);
    ListDelete(&L,l);
    printf("此时链表的各元素如下:\n");
    Output(L);
    return 0;
}

运行实例:

在这里插入图片描述

参考文献:

《大话数据结构》

  • 37
    点赞
  • 266
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个完整版的线性表代码,包括顺序表和链表两种实现方式: 1. 顺序表实现: ```c #define MaxSize 100 // 定义线性表的最大长度 typedef struct { int data[MaxSize]; // 存储线性表元素的数组 int length; // 线性表的当前长度 } SqList; // 顺序表类型定义 // 初始化线性表 void InitList(SqList &L) { for (int i = 0; i < MaxSize; i++) { L.data[i] = 0; // 将所有元素初始化为0 } L.length = 0; // 线性表长度初始化为0 } // 插入元素 bool ListInsert(SqList &L, int i, int e) { if (i < 1 || i > L.length + 1) { // 判断插入位置是否合法 return false; } if (L.length >= MaxSize) { // 判断线性表是否已满 return false; } for (int j = L.length; j >= i; j--) { // 将插入位置后的元素依次后移 L.data[j] = L.data[j - 1]; } L.data[i - 1] = e; // 将新元素插入到指定位置 L.length++; // 线性表长度加1 return true; } // 删除元素 bool ListDelete(SqList &L, int i, int &e) { if (i < 1 || i > L.length) { // 判断删除位置是否合法 return false; } e = L.data[i - 1]; // 将被删除的元素赋值给e for (int j = i; j < L.length; j++) { // 将删除位置后的元素依次前移 L.data[j - 1] = L.data[j]; } L.length--; // 线性表长度减1 return true; } // 查找元素 int LocateElem(SqList L, int e) { for (int i = 0; i < L.length; i++) { if (L.data[i] == e) { return i + 1; // 返回元素在线性表中的位置 } } return 0; // 没有找到返回0 } ``` 2. 链表实现: ```c typedef struct Node { int data; // 存储数据元素 struct Node *next; // 存储下一个节点的指针 } LNode, *LinkList; // 链表节点类型定义和链表类型定义 // 初始化链表 void InitList(LinkList &L) { L = (LinkList)malloc(sizeof(LNode)); // 创建头节点 L->next = NULL; // 头节点的指针域初始化为NULL } // 插入元素 bool ListInsert(LinkList &L, int i, int e) { LinkList p = L, s; // p指向头节点,s为新节点 int j = 0; while (p && j < i - 1) { // 寻找第i-1个节点 p = p->next; j++; } if (!p || j > i - 1) { // 判断插入位置是否合法 return false; } s = (LinkList)malloc(sizeof(LNode)); // 创建新节点 s->data = e; // 将新元素赋值给新节点 s->next = p->next; // 将新节点插入到第i个节点之后 p->next = s; return true; } // 删除元素 bool ListDelete(LinkList &L, int i, int &e) { LinkList p = L, q; // p指向头节点,q为待删除节点 int j = 0; while (p->next && j < i - 1) { // 寻找第i-1个节点 p = p->next; j++; } if (!p->next || j > i - 1) { // 判断删除位置是否合法 return false; } q = p->next; // 将待删除节点赋值给q e = q->data; // 将待删除节点的元素赋值给e p->next = q->next; // 将待删除节点从链表中删除 free(q); // 释放待删除节点的内存空间 return true; } // 查找元素 int LocateElem(LinkList L, int e) { LinkList p = L->next; // p指向第一个节点 int i = 1; while (p) { // 遍历链表 if (p->data == e) { return i; // 返回元素在链表中的位置 } p = p->next; i++; } return 0; // 没有找到返回0 } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值