线性表的链式表示和实现

线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素。(这些存储单元可以是连续的,也可以是不连续的)

下面直接看实现代码,代码只实现了创建,插入和删除:

//
//  main.c
//  001-线性表的链式表示和实现
//


#include <stdio.h>
#include <stdlib.h>

typedef char ElemType;

//线性表的单链表存储结构
typedef struct LNode{
    ElemType data;
    struct LNode * next;
}LNode, *LinkList;
int createList(LinkList * L, ElemType * elems, int length){
    *L = (LinkList)malloc(sizeof(LNode));
    (*L)->next = NULL;
    for (int i = 0; i < length; i++) {
        LinkList p = (LinkList)malloc(sizeof(LNode));
        p->next = (*L)->next;
        (*L)->next = p; //每个元素都插入到表头
        p->data = elems[i];
    }
    return 1;
}
int insertList(LinkList * L, ElemType elem, int i){
    //在带头结点的单链线性表L中第i个位置之前插入元素elem
    LinkList p = * L;
    int j = 0;
    while (p && j < i-1) { //不能在头结点之前插入,故i>1
        p = p->next;
        j++;
    }
    if (!p || j > i-1) {  //此时到了链表末尾
        return 0;
    }
    LinkList s = (LinkList)malloc(sizeof(LNode));
    s->data = elem;
    s->next = p->next;
    p->next = s;
    return 1;
}

//删除第i个元素
int deleteList(LinkList * L, int i, ElemType * elem){
    LinkList p = *L;
    int j = 0;
    while (p && j < i-1) { //寻找第i个节点,令p只想其前驱
        p = p->next;
        j++;
    }
    if (!(p->next) || j > i-1) {
        return 0;
    }
    LinkList q = p->next; //q就是需要删除的结点
    p->next = q->next;
    *elem = q->data;
    free(q);
    return 1;
}


int main(int argc, const char * argv[]) {
    // insert code here...
    printf("Hello, World!\n");
    
    ElemType elems[10] = {'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'};
    LinkList L;
    createList(&L, elems, 10);
    
    for (int i = 0; i < 5; i++) {
        insertList(&L, 'k'+i, 3);
    }
    
    ElemType elem;
    deleteList(&L, 10, &elem);
    printf("删除的元素是:%c\n", elem);
    
    LinkList find = L;
    while (find->next != NULL) {
        find = find->next;
        printf("%c\n", find->data);
    }
    
    return 0;
}
输出:

Hello, World!
删除的元素是:f
j
i
o
n
m
l
k
h
g
e
d
c
b
a
Program ended with exit code: 0


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值