数据结构-单链表基本操作

#include <iostream>
using namespace std;

typedef char DataType;

struct node{
    DataType data;
    struct node *next;
};

typedef struct node ListNode;
typedef ListNode *LinkList;

//建空表(尾插法)
LinkList createR(){
    LinkList head,rear;
    head = NULL;rear = NULL;
    ListNode *p;
    char ch = getchar();
    if (ch != '\n') {
        p = (ListNode*)malloc(sizeof(ListNode));
        p->data = ch;
        if (head==NULL) {
            head = p;
        } else {
            rear->next = p;
        }
        rear = p;
        ch = getchar();
    }
    if (rear!=NULL) {
        rear->next = NULL;
    }
    return head;;
}
//建立链表(带头结点的尾插法)
LinkList createR1(){
    LinkList head = (LinkList)malloc(sizeof(LinkList));
    ListNode *p,*rear;
    char ch;
    rear = head;
    while ((ch = getchar()) != '\n') {
        p = (ListNode*)malloc(sizeof(ListNode));
        p->data = ch;
        rear->next = p;
        rear= p;
    }
    rear->next = NULL;

    return head;
}

//插入(插入和删除操作都需要找i的前一个结点)
void insertList(LinkList head,int i,DataType x){
    ListNode *p = head;
    int j=0;
    while (p && j<i-1) {
        p = p->next;
        j++;
    }
    if (p == NULL) {
        cout << "插入位置错误" << endl;
    } else {
        ListNode *s = (ListNode*)malloc(sizeof(ListNode));
        s->data = x;
        s->next = p->next;
        p->next = s;
    }
}
//删除
DataType deleteList(LinkList head,int i){
    //需要两个结点指针,一个指向i的前一个结点,一个指向i结点。
    ListNode *p = head,*s=NULL;
    int j=0;
    while (p && j<i-1) {
        p = p->next;
        j++;
    }
    if (p == NULL) {
        cout << "插入位置错误" << endl;
        return NULL;
    } else {
        s = p->next;
        DataType x = s->data;
        p->next = s->next;
        free(s);
        return x;
    }
}

//根据位置i查找(带头结点)
ListNode* getNodei(LinkList head,int i){
    ListNode *p = head->next;
    int j=1;
    while(p != NULL && j<i){
        p=p->next;
        j++;
    }
    if (j==i) {
        return p;
    } else {
        return NULL;
    }
}

//根据元素x查找
ListNode* getNodex(LinkList head,DataType x){
    ListNode *p = head->next;
    while (p && x != p->data) {
        p = p->next;
    }
    return p;
}

//返回表长(带头结点)
int getLength(LinkList p){
    int length = -1;
    while (p!=NULL) {
        p = p->next;
        length++;
    }
    return length;
}

//遍历输出链表数据
void showList(LinkList p){
    while (p!=NULL) {
        printf("%1c",p->data);
        p = p->next;
    }
    cout << endl;
}

void split(LinkList a,LinkList b);
LinkList mergeList(LinkList La,LinkList Lb);

int main(int argc, const char * argv[]) {
//    LinkList linklist = createR1();
//    insertList(linklist, 2, 'w');
//    showList(linklist);
//
//    cout << "表长为" << getLength(linklist) << endl;
//
//    ListNode *p = getNodei(linklist, 3);
//    cout << "第3个元素是" << p->data << endl;
//
//    ListNode *p1 = getNodex(linklist, 'b');
//    cout << "b的元素是" << p1->data << endl;
//
//    DataType ch = deleteList(linklist, 1);
//    cout << "删除的元素是" << ch << endl;
//
//    showList(linklist);
    
    cout << "建表a" << endl;
    LinkList a = createR1();
    
    cout << "建表b" << endl;
    LinkList b = createR1();
    
    showList(a);
    showList(b);
    
//    split(a,b);
//    showList(a);
//    showList(b);
    LinkList Lc =  mergeList(a, b);
    showList(Lc);
    
    return 0;
}

//试写一算法,将一个头结点指针为a的带头结点的单链表A分解成两个单链表A和B,其中头结点指针分别为a和b,使得A链表中含有原链表A中序号为奇数的元素,B链表中含有原链表中序号为偶数的元素。并保持原来的顺序。
void split(LinkList a,LinkList b){
    LinkList A=a,B=b;
    ListNode *p;
    p = a->next;
    while (p != NULL) {
        //奇数
        A->next = p;
        A = p;
        p = p->next;
        if (p) {
            //偶数
            B->next = p;
            B = p;
            p = p->next;
        }
    }
    A->next = NULL;
    B->next = NULL;
}


//假设头指针为La和Lb的单链表(带头结点)分别为线性表A和B的存储结构,两个链表都是按结点递增有序的。试写一算法,将两个单链表合并为一个有序链表Lc。
LinkList mergeList(LinkList La,LinkList Lb){
    ListNode *pa = La->next;
    ListNode *pb = Lb->next;
    LinkList Lc = La;
    LinkList pc = La;
    while (pa!=NULL && pb!=NULL) {
        if (pa->data<pb->data) {
            pc->next = pa;
            pc = pa;
            pa = pa->next;
        } else {
            pc->next = pb;
            pc = pb;
            pb = pb->next;
        }
    }
    if (pa==NULL) {
        pc->next = pb;
        free(La);
    } else {
        pc->next = pa;
        free(Lb);
    }
    return Lc;
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值