您的位置:首页 > 理论基础 > 数据结构算法

(数据结构第二章)线性链表的实现

2015-04-10 22:22 260 查看
///链表的实现
///单链表存储
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstdlib>
#define ERROR -1
#define OK 1
using namespace std;
typedef struct LNode{
    int data;
    struct LNode *next;
}LNode, *LinkList;
void CreateList_L(LinkList &L,int n)
{
    ///逆位序输入n个元素的值,建立带表头结点的单链表线性表
    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;
    }
}
void Printf_L(LinkList L)
{
    ///输出单链表L
    printf("该单链表值为:");
    LinkList p = L->next;
    while(p)
    {
        printf("%d  ",p->data);
        p = p->next;
    }
    printf("\n");
    printf("\n");
}
bool GetElem_L(LinkList L,int i,int &e)
{
    ///L为带头节点的头指针
    ///当第i个元素存在时,其赋值给e并返回OK,否则ERROR
    LinkList p = L->next;
    int j=1; /// 初始化p指向第一个节点,j计数器
    while(p && j <i){
        p = p->next; ++j;
    }
    if(!p || j>i) return ERROR;
    e = p->data;
    return OK;
}
bool ListInsert_L(LinkList &L, int i, int e)
{
    ///带头节点的单链表L中第i个位置之前插入元素e
    LinkList p = L;
    int j=0;
    while(p && j < i-1) { p = p->next; ++j; }   /// 寻找第i-1个节点
    if(!p || j>i-1) return ERROR;                /// i小于1或者大于表长加1
    LinkList s = (LinkList) malloc (sizeof(LNode));  ///生成新的结点
    s -> data = e; s -> next = p->next;             ///插入L中
    p -> next = s;
    return OK;
}//ListInsert_L
bool ListDelete_L(LinkList &L, int i,int &e)
{
    ///在带头结点的单链表线性表L中,删除第i个元素,并有e返回其值
    LinkList p = L;
    int j=0;
    while(p->next && j < i-1){      /// 寻找第i个节点,并令p指向其前驱
        p = p->next; ++j;
    }
    if(!(p->next) || j > i-1) return ERROR; ///删除位置不合理
    LinkList q = p->next; p->next = p->next->next;  ///删除并释放节点
    e = q->data; free(q);
    return  OK;
}
int MergeList_L(LinkList &La,LinkList &Lb,LinkList &Lc)
{
    ///已知单链线性表La和Lb的元素按值非递减排列
    ///归并La和Lb得到新的单链线性表Lc,Lc的元素也按值非递减排列
    LinkList pa = La->next, pb = Lb ->next;
    LinkList pc = Lc = 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()
{
    int n;
    LinkList L;
    printf("请输入要输入节点个数:");
    scanf("%d",&n);
    CreateList_L(L,n);
    Printf_L(L);

    ///测试GetElem
    int e,i;
    printf("输入要找的元素的i:");
    scanf("%d",&i);
    GetElem_L(L,i,e);
    printf("该元素是%d\n",e);
    printf("\n");

    ///测试ListInsert_L
    printf("请输入要插入的位置:");
    scanf("%d",&i);
    printf("请输入要要插入的值:");
    scanf("%d",&e);
    ListInsert_L(L,i,e);
    Printf_L(L);

    ///测试ListDelete_L
    printf("请输入要删除的元素的位序:");
    scanf("%d",&i);
    ListDelete_L(L,i,e);
    Printf_L(L);

    ///测试MergeList_L
    LinkList Lb;
    printf("请输入Lb要输入节点个数:");
    scanf("%d",&n);
    CreateList_L(Lb,n);
    Printf_L(Lb);
    LinkList Lc;
    MergeList_L(L,Lb,Lc);
    printf("Lc");
    Printf_L(Lc);

    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: