数据结构之线性表的链式表示和实现

来源:互联网 发布:淘宝上好的澳洲代购 编辑:程序博客网 时间:2024/04/27 14:54
//测试环境:VS2015#include "stdafx.h"#include<stdlib.h>#include<stdio.h>//宏定义#define ERROR 0#define OK 1//定义单链表的存储结构typedef struct LNode{    int data;    struct LNode *next;}LNode, *LinkList;//在带头节点的链表中获取第i个节点值,并用元素e返回int getElem(LinkList L, int i, int &e){    //L是带头节点的单链表的头指针    LinkList p = L->next;    int j = 1;    while (p&&j < i)    {        p = p->next;//寻找第i个节点        j++;    }    if (!p || j > i)    {        return ERROR;    }    e = p->data;    return OK;}//在带头节点的链表中的第i个节点前插入元素eint listInsert(LinkList &L, int i, int e){    LinkList p = L;    int j = 0;    while (p&&j < i-1)    {        p = p->next;//寻找第i-1个节点        j++;    }    if (!p||j>i-1)    {        return ERROR;    }    LinkList s = (LinkList)malloc(sizeof(LNode));    if (!s)    {        return ERROR;    }    s->data = e;    s->next = p->next;    p->next = s;    return OK;}//在头节点的单链表L中,删除第i个节点的元素,并用e返回int listDelete(LinkList &L, int i, int &e){    LinkList p = L;    int j = 0;    while (p->next&&j < i - 1)    {        p = p->next;//寻找第i-1个节点        j++;    }    if (!(p->next) || j > i - 1)    {        return ERROR;    }    LinkList q = p->next;    e = q->data;     p->next = q->next;    free(q);    return OK;}//创建链表int createList(LinkList &L, int n){    //按顺位序输入n个元素的值,建立带头节点的单链表    L = (LinkList)malloc(sizeof(LNode));    L->next = NULL;//建立头节点    LinkList q = L;    for (int i = 1; i <= n; i++)    {        LinkList s = (LinkList)malloc(sizeof(LNode));        if (!s)        {            return ERROR;        }        scanf_s("%d", &s->data);        q->next = s;        s->next = NULL;        q = s;        //按逆序位输入        //s->next = L->next;//连接第一个节点        //L->next = s;    }    return OK;}//合并链表int mergerList(LinkList &La, LinkList &Lb, LinkList &Lc){    //已知单链表La,Lb按值非递减排列,合并后得到的单链表Lc也按值非递减排列    LinkList pa = La->next;    LinkList pb = Lb->next;    LinkList pc = Lc = La;    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的头节点    return OK;}//测试int main(){    int e;    LinkList list1,list2,list3;    //创建链表list1    createList(list1, 7);    for (int i = 1; i <= 7; i++)    {        getElem(list1, i, e);        printf("%d ", e);    }    printf("\n");    //插入节点    listInsert(list1, 8, 100);    for (int i = 1; i <= 8; i++)    {        getElem(list1, i, e);        printf("%d ", e);    }    printf("\n");    listDelete(list1, 1, e);    for (int i = 1; i <= 7; i++)    {        getElem(list1, i, e);        printf("%d ", e);    }    printf("\n");    //创建链表list2    createList(list2, 7);    for (int i = 1; i <= 7; i++)    {        getElem(list2, i, e);        printf("%d ", e);    }    printf("\n");    //合并链表到list3    mergerList(list1, list2, list3);    for (int i = 1; i <= 14; i++)    {        getElem(list3, i,e);        printf("%d ", e);    }    printf("\n");    return 0;}
1 0
原创粉丝点击