线性表的链式存储

这篇博客详细介绍了C++中链表数据结构的操作,包括无头结点和带头结点的链表创建,按位置和值查找节点,插入新元素,删除指定位置的元素,以及将两个已排序链表合并成一个有序链表。这些基本操作对于理解和实现链表算法至关重要。
摘要由CSDN通过智能技术生成

###请在C++环境中运行

 

#include<stdio.h>
#include<stdlib.h>
typedef int DataType;
typedef struct node {
    DataType data;
    struct node* next;
}ListNode;

typedef ListNode* LinkList;
ListNode* p;
LinkList head;

//头插入法 没有头结点
LinkList CreateListF() {
    LinkList head;
    ListNode *p;
    DataType ch;
    head = NULL;
    while ((ch = getchar()) != '\n')
    {
        p = (ListNode *)malloc(sizeof(ListNode));
        if (p == NULL) {
            return head;
        }
        p->data = ch;
        p->next = head;
        head = p;
    }
    return head;
}


//头插入法 有头结点
LinkList CreateListFT() {
    LinkList headNode = (ListNode*)malloc(sizeof(ListNode));
    if (headNode == NULL) {
        return headNode;
    }
    LinkList head;
    ListNode* p;
    DataType ch;
    head = NULL;
    while ((ch = getchar()) != '\n')
    {
        p = (ListNode*)malloc(sizeof(ListNode));
        if (p == NULL) {
            return headNode;
        }
        p->data = ch;
        p->next = head;
        head = p;
    }
    headNode->next = head;
    return headNode;
}

//尾插入法 带有头结点的
LinkList CreateListR() {
    //申请一个头结点
    LinkList head = (ListNode*)malloc(sizeof(ListNode));
    ListNode * p, * r;
    DataType ch = NULL;
    r = head;
    if (r == NULL) {
        return head;
    }
    while ((ch = getchar()) != '\n') {
        p = (ListNode*)malloc(sizeof(ListNode));
        if (p == NULL){
            return head;
        }
        p->data = ch;
        r->next = p;
        r = p;
    }
    r->next = NULL;
    return head;
}

//查找運算帶有头结点 查找第i个元素
ListNode* GetNodei(LinkList head,int i) {
        ListNode* p; int j;
        p = head->next;
        j = 1;

        while (p != NULL && j<i){
            p = p->next;
            j++;
        }
        if (j == i){
            return p;
        }else {
            return NULL;

        }

}
//查找带有头结点的 按值查找
ListNode* LocateNodeK(LinkList head,DataType k) {
    ListNode* p = head->next;//p指向开始结点
    while ((p != NULL) && k!= p->data){
        p = p->next;
    }
    return p;
}

//查找带有头结点的 插入
void InsertList(LinkList head,int i,DataType x) {
    ListNode* p = head;
    int j = 0;
    while ((head != NULL)&& j<i-1){
        p = p->next;
        j++;
    }
    if (p == NULL){
        printf("error\n");
        return;
    }else{
        ListNode * s = (ListNode*)malloc(sizeof(ListNode));
        if (s == NULL) {
            printf("生成结点error\n");
            return;
        }
        s->data = x;
        s->next = p->next;
        p->next = s;
    }
}

//带有头结点的删除
DataType DeleteList(LinkList head, int i) {
    DataType x;
    ListNode* p,*s;
    int j = 0;
    p = head->next;
    while ((p != NULL)&&j<i-1){
        j++;
        p = p->next;
    }
    if (p == NULL) {
        printf("error\n");
        exit(0);
    }else {
        s = p->next;
        p->next = s->next;
        x = p->data;
        free(s);
        return x;
    }


}

//将链表拆分两个链表,A B     A含有奇数序号的结点,B含有偶数序号的结点
void split(LinkList a,LinkList b) {
    ListNode* p, * r,*s;
    r = a;
    s = b;
    p = a->next;
    while (p !=NULL) {
        r->next = p;
        r = p;
        p = p->next;
        if (p){
            s->next = p;
            s = p;
            p = p->next;
        }
    }
    r->next = s->next = NULL;
}
//假设头指针为La和Lb的单链表(带头结点) 分别为线性表的A和B的存储结构,两个链表都是按照结点值递增有序的
//式写一个算法将两个单链表合成一个有序的表LC
LinkList MergeList(LinkList la, LinkList lb) {
    ListNode* pa, * pb,*h,* pc,*head;
    pa = la->next;
    pb = lb->next;
    head =(ListNode*)malloc(sizeof(ListNode));
    if (head == NULL) {
        exit(0);
    }

    h = head;
    while (pa!=NULL&&pb !=NULL) {
        pc  = (ListNode*)malloc(sizeof(ListNode));
        if (pc == NULL) {
            exit(0);
        }
        if (pa->data<=pb->data) {
            pc->data = pa->data;
            pc->next = pa->next;
            head->next = pc;
            head =pc;
            pa = pa->next;
        }else{
            pc->data = pb->data;
            pc->next = pb->next;
            head->next = pc;
            head = pc;
            pb = pb->next;
        }
    }

    head->next = pa!= NULL ? pa : pb;
    free(lb);
    free(la);
    return h;
}


int main()
{
    //LinkList head=CreateListF();
    /*while (head != NULL)
    {
        putchar(head->data);
        head = head->next;

    }*/
    /*
    尾插入法遍历 带有头结点
    LinkList head= CreateListR();
    head = head->next;
    while (head!=NULL)
    {
        putchar(head->data);
        head = head->next;

    }*/

    //头插入法遍历 带有头结点
    /*LinkList head = CreateListFT();
    head = head->next;
    while (head != NULL)
    {
        putchar(head->data);
        head = head->next;

    }*/


    
    //尾插入法遍历 带有头结点 查找第i个元素
    /*LinkList head= CreateListR();
    ListNode* p = GetNodei(head, 3);
    putchar(p->data);*/

    //尾插入法遍历 带有头结点 按照值查找
    //LinkList head = CreateListR();
    没有值返回N
    //DataType noValue = 'N';
    //ListNode* p = LocateNodeK(head, 'r');
    //if (p != NULL) {
    //    putchar(p->data);
    //}else{
    //    putchar(noValue);
    //}

    //带头结点的插入
    /*LinkList head = CreateListR();
    InsertList(head, 3, 'w');
    head = head->next;
    while (head != NULL)
    {
        putchar(head->data);
        head = head->next;

    }*/
    //带头结点删除
    /*LinkList head = CreateListR();
    DeleteList(head, 3);
    head = head->next;
    while (head != NULL)
    {
        putchar(head->data);
        head = head->next;

    }*/


    //将链表拆分两个链表,A B     A含有奇数序号的结点,B含有偶数序号的结点
    /*LinkList head = CreateListR();
    LinkList b =(ListNode*) malloc(sizeof(ListNode));
    split(head, b);

    head = head->next;
    while (head != NULL)
    {
        putchar(head->data);
        head = head->next;
    }
    printf("\n");
    if(b !=NULL){
    head = b->next;
    while (head != NULL)
    {
        putchar(head->data);
        head = head->next;
    }
    }*/


    //假设头指针为La和Lb的单链表(带头结点) 分别为线性表的A和B的存储结构,两个链表都是按照结点值递增有序的
//式写一个算法将两个单链表合成一个有序的表LC
    LinkList la = CreateListR();
    LinkList lb = CreateListR();
    LinkList lc = MergeList(la, lb);
        while ((lc = lc->next) != NULL)
        {
            putchar(lc->data);
        }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值