数据结构(C语言)——线性表的表示【顺序表和链式表】

目录

顺序线性表

①定义结构体;

②初始化方法

③数据插入[直接赋值]

补充:两个顺序表排序归并

链式线性表

①结构体定义;

②初始化方法

③尾插操作方法

补充:两个链表排序归并


前言:仅为巩固和完善上课内容所作,如有错误感谢指点

作者:hznu_AllanPoeeeeeee

最后编辑时间:2023.11.14


数据的存储结构分为:顺序存储结构和链式存储结构

线性表按存储结构分为:顺序线性表和链式线性表


顺序线性表

①定义结构体;

        储存数据的指针(数组),已被存储的数据的长度

typedef struct {
    int *data; 
    int len;
} SeqList;

SeqList List1;

②初始化方法

SeqList InitList(int len){//初始化
    SeqList L;
    L.len=len;
    L.data=(int *)malloc((len) * sizeof(int));
    return L;
}

List1=InitList(m1);

③数据插入[直接赋值]

scanf(“%d”,&List1.data[i]);

补充:两个顺序表排序归并

SeqList f(SeqList List1, SeqList List2) {//归并
    int i = 0, j = 0, k = 0;
    int len1 = List1.len;
    int len2 = List2.len;

    SeqList ans;
    ans=InitList(len1+len2);

    while (i < len1 && j < len2) {
        if (List1.data[i] <= List2.data[j]) {
            ans.data[k++] = List1.data[i++];
        } else {
            ans.data[k++] = List2.data[j++];
        }
    }

    //剩余数据添加到末尾
    while (i < len1) {
        ans.data[k++] = List1.data[i++];
    }
    while (j < len2) {
        ans.data[k++] = List2.data[j++];
    }
    return ans;
}

SeqList ans = f(List1, List2);

链式线性表

①结构体定义;

        储存数据的一个单元、指向下个位置的指针域

typedef struct NodeList{
    int data; 
    struct NodeList* next;
}NodeList;

NodeList* List1;

②初始化方法

NodeList* InitList(){//初始化
    NodeList* head;
    head=(NodeList*)malloc(sizeof(NodeList));
    head->next=NULL;
    return head;
}

List1=InitList();

③尾插操作方法

void push_back(NodeList* head,int data){//尾插数据
    NodeList* Node;
    Node= InitList();
    Node->data=data;
    Node->next=NULL;
    NodeList* p=head;
    while(p->next!=NULL){
        p=p->next;
    }
    p->next=Node;
}

push_back(List1,temp);

补充:两个链表排序归并

NodeList* f(NodeList* list1,NodeList* list2) {
    NodeList* mergedList;//表头,需要返回的结果
    mergedList = InitList();

    NodeList* p = mergedList;//后续需要新链表里作为插入的指针
    NodeList* p1 = list1->next;
    NodeList* p2 = list2->next;

    while (p1 != NULL && p2 != NULL){
        if (p1->data <= p2->data) {
            p->next = p1;//push_back(p,p1->data);
            p1 = p1->next;
        } else {
            p->next = p2;//push_back(p,p2->data);
            p2 = p2->next;
        }
        p = p->next;
    }
    //剩余数据链接到p的末尾
    if (p1 != NULL) {//p1剩余
        p->next = p1;
    }
    if (p2 != NULL) {//p2剩余
        p->next = p2;
    }
    return mergedList;//返回头指针
}

NodeList* mergedList = f(List1, List2);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值