2.1数据结构书上可运行代码--线性表的链式表示和实现

#include <iostream>

using namespace std;
typedef struct node
{
    int data;
    struct node *next;
} LNode, *LinkList;
void CreateList_L(LinkList &L, int n) //*2.4用表头插入法逆序建立带头结点的单链表
{
    L = (LinkList) malloc(sizeof(LNode)); //未做溢出判定,应加入
    L->next = NULL; //建立头结点,假定与元素结点结构相同
    for(int i=n; i>0; --i)   //从后向前输入元素
    {
        LinkList p = (LinkList)malloc(sizeof(LNode));//生成新结点
        scanf("%d",&p->data); //从键盘输入元素值,存入新结点中
        p->next = L->next;
        L->next = p; //新结点插入到表头
    }
}

LinkList CreatListR1(void)//*2.5用尾插法建立带头节点的单链表
{
    char ch;
    LinkList head = (LinkList)malloc(sizeof(LNode));//生成头结点
    LinkList s,r;//工作指针
    r = head;//尾指针也指向头结点
    while((ch=getchar()!='\n'))
    {
        s=(LinkList)malloc(sizeof(LNode));//生成新结点
        s->data = ch;//将读入的数据放入新结点的数据域中
        r->next = s;
        r=s;
    }
    r->next = NULL;//尾结点的指针域置空
    return head;
}

int GetElem_L(LinkList L, int i, int &e)//*2.1查找第i个元素
{
    LinkList p;
    p=L->next;
    int j=1;
    while(p&&j<i)
    {
        p=p->next;
        j++;
    }
    if(!p||j>i)
        return 0;
    e=p->data;
    return 1;
}
LinkList CreateList_LT( )//*2.6表尾插入法建立不带头结点的单链表
{
    char ch;
    LinkList head;
    LNode *p, *r ; //p 指向新申请的结点,r 指向链表的尾结点
    head = NULL;
    r = NULL;
    while((ch = getchar() != '\n'))
    {
        p = (LinkList)malloc(sizeof(LNode));
        p->data = ch;
        if(head == NULL)//插入第一个结点
            head = p;
        else
            r->next = p; //插入第二个及以后的结点
        r = p;
    }
    if (r != NULL)
    r->next = NULL;
                return head;
}

int ListInsert_L(LinkList &L, int i, int e)//*2.2在带头结点的单链线性表L中第i个位置之前插人元素e
{
    LinkList p=L;
    int j = 0;
    while(p && j<i-1)
    {
        p = p->next;
        ++j;
    }//寻找第i-1个结点
    if (p == NULL || j > i-1)
        return 0;//i小于1或者大于表长加1
    LinkList s = (LinkList)malloc(sizeof(LNode));//生成新结点
    s->data=e;
    s->next = p->next;//插人L中
    p->next =s;
    return 1;
}// ListInsert L
int ListDelete_L(LinkList &L, int i, int &e)//*2.3在带头结点的单链线性长L中,删除第i个心素,并山e返回其值
{
    LinkList p = L, q;
    int j=0;
    while(p->next && j<i-1) //寻找第i个结点﹐并令p指向其前趋
    {
        p = p->next;
        j++;
    }
    if ((p->next==NULL) || j>i-1)
        return 0;//删除位置不合理
    q = p->next ;
    p->next = q->next;//删除并释放结点
    e = q->data;
    free(q);
    return 1;
}//ListDelete_L
void MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)//*2.7已知单链线性表La和Lb的元素按值非递减排列。
//归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列。
{
    LinkList pa = La->next;
    LinkList pb = Lb->next, pc;
    Lc = pc = La;   //用La的头结点作为Lc的头结点
    while (pa && pb)
    {
        if(pa->data<=pb->data)
        {
            pc->next =pa;
            pc = pa;
            pa =pa->next;
        }
        else
        {
            pc->next = pb;
            pc= pb;
            pb=pb->next;
        }
    }
    pc->next=pa?pa:pb;//插人剩余段
    free(Lb);//释放Lb的头结点
}//MergeList-L
int main()
{
    LinkList p,H,tail;

    int arr[10]= {1,2,3,4,5,6,7,8,9,10};
    int n=5;
    int x;
    H = (LinkList)malloc(sizeof(LNode));
    H->next = NULL;
    tail = H;
    for(int i=0; i<n; i++)
    {
        p=(struct node*)malloc(sizeof(LNode));
        p->data = arr[i];
        p->next = NULL;
        tail->next = p;
        tail = p;
    }
    p=H->next;
    //GetElem_L(H, 3, x);//查找
    //ListInsert_L(H, 3, 10);//插入
    //ListDelete_L(H, 3, x);
    LinkList HH,HC;
    HH = (LinkList)malloc(sizeof(LNode));
    HH->next = NULL;
    tail = HH;
    for(int i=0; i<2*n; i+=2)
    {
        p=(struct node*)malloc(sizeof(LNode));
        p->data = arr[i];
        p->next = NULL;
        tail->next = p;
        tail = p;
    }
    MergeList_L(H,HH,HC);

    p=HC->next;
    while(p->next!=NULL)
    {
        printf("%d ", p->data);
        p=p->next;
    }
    printf("%d\n", p->data);
    //printf("%d\n", x);
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42137874/article/details/107685771