码迷,mamicode.com
首页 > 其他好文 > 详细

2.8~2.12带头节点的链表的基本操作

时间:2015-06-06 00:12:31      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:

2.8和2.9在带头结点的链表中实现插入和获取元素的操作

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef int Status ;
typedef int ElemType;
#define OK 1
#define ERROR 0

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;


Status InitList(LinkList *L)
{
    *L=(LinkList)malloc(sizeof(struct LNode));
    if(!*L)
        exit(OVERFLOW);
    (*L)->next=NULL;
    return OK;
}
Status ListInsert(LinkList L,int i,ElemType e)
{
    int j=0;
    LinkList p=L,s;
    while(p&&j<i-1)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
        return ERROR;
    s=(LinkList)malloc(sizeof(struct LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}
Status GetElem(LinkList L,int i,ElemType *e)
{
    int j=0;
    LinkList p=L;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        return ERROR;
    *e=p->data;
    return OK;
}
void main()
{
    LinkList L;
    ElemType e;
    int j;
    InitList(&L);
    for(j=1;j<=5;j++)
        ListInsert(L,j,j);
    printf("L=");
    for(j=1;j<=5;j++)
    {
        GetElem(L,j,&e);
        printf("%d ",e);
    }
    printf("\n");
}

程序运行如下:

技术分享

2.10在带头结点的链表中实现删除元素操作

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef int Status ;
typedef int ElemType;
#define OK 1
#define ERROR 0

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;


Status InitList(LinkList *L)
{
    *L=(LinkList)malloc(sizeof(struct LNode));
    if(!*L)
        exit(OVERFLOW);
    (*L)->next=NULL;
    return OK;
}
Status ListInsert(LinkList L,int i,ElemType e)
{
    int j=0;
    LinkList p=L,s;
    while(p&&j<i-1)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
        return ERROR;
    s=(LinkList)malloc(sizeof(struct LNode));
    s->data=e;
    s->next=p->next;
    p->next=s;
    return OK;
}
Status GetElem(LinkList L,int i,ElemType *e)
{
    int j=0;
    LinkList p=L;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        return ERROR;
    *e=p->data;
    return OK;
}
Status ListDelete(LinkList *L,int i,ElemType *e)
{
    int j=0;
    LinkList p=*L,q;
    while(p&&j<i-1)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
        return ERROR;
    q=p->next;
    p->next=q->next;
    *e=q->data;
    free(q);
    return OK;
}

void main()
{
    LinkList L;
    ElemType e;
    int j;
    InitList(&L);
    for(j=1;j<=5;j++)
        ListInsert(L,j,j);
    printf("L=");
    for(j=1;j<=5;j++)
    {
        GetElem(L,j,&e);
        printf("%d ",e);
    }
    printf("\n");
    ListDelete(&L,2,&e);
    printf("删除链表L中的第2个元素\n");
    for(j=1;j<=4;j++)
    {
        GetElem(L,j,&e);
        printf("%d ",e);
    }
    printf("\n");

}

程序运行如下:

技术分享

2.11在带头结点的链表中,实现逆位序输入n个元素

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef int Status ;
typedef int ElemType;
#define OK 1
#define ERROR 0

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;


void CreateList(LinkList *L,int n) //实现逆位序输入n个元素)
{
    int i;
    LinkList p;
    *L=(LinkList)malloc(sizeof(struct LNode));
    if(!*L)
        exit(OVERFLOW);
    (*L)->next=NULL;
    for(i=n;i>0;i--)
    {
        p=(LinkList)malloc(sizeof(struct LNode));
        if(!p)
            exit(OVERFLOW);
        scanf("%d",&((*L)->data));
        p->next=*L;
        *L=p;
    }
}

Status GetElem(LinkList L,int i,ElemType *e)
{
    int j=0;
    LinkList p=L;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        return ERROR;
    *e=p->data;
    return OK;
}
Status ListDelete(LinkList *L,int i,ElemType *e)
{
    int j=0;
    LinkList p=*L,q;
    while(p&&j<i-1)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
        return ERROR;
    q=p->next;
    p->next=q->next;
    *e=q->data;
    free(q);
    return OK;
}

void main()
{
    LinkList L;
    ElemType e;
    int j,k;
    printf("请输入打算建立的带有头结点的链表结点个数:");
    scanf("%d",&k);
    CreateList(&L,k);
    for(j=1;j<=k;j++)
    {
        GetElem(L,j,&e);
        printf("%d ",e);
    }
    printf("\n");

}

程序运行如下:

技术分享

2.12将两个有序链表并为一个有序链表

#include<stdio.h>
#include<stdlib.h>
#include<math.h>

typedef int Status ;
typedef int ElemType;
#define OK 1
#define ERROR 0

typedef struct LNode
{
    ElemType data;
    struct LNode *next;
}LNode,*LinkList;

Status InitList(LinkList *L)
{
    *L=(LinkList)malloc(sizeof(struct LNode));
    if(!*L)
        exit(OVERFLOW);
    (*L)->next=NULL;
    return OK;
}
Status ListInsert(LinkList *L,int i,ElemType e)
{
    int j=0;
    LinkList p=*L,s;
    while(p&&j<i-1)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i-1)
        return ERROR;
    s=(LinkList)malloc(sizeof(struct LNode));
    s->next=p->next;
    p->next=s;
    s->data=e;
    return OK;
}
Status GetElem(LinkList L,int i,ElemType *e)
{
    int j=0;
    LinkList p=L;
    while(p&&j<i)
    {
        p=p->next;
        ++j;
    }
    if(!p||j>i)
        return ERROR;
    *e=p->data;
    return OK;
}
void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc)
{
    LinkList pa,pb,pc;
    pa=(*La)->next;
    pb=(*Lb)->next;
    *Lc=pc=*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);
}

void main()
{
    LinkList La,Lb,Lc,c;
    ElemType e;
    int j;
    InitList(&La);
    for(j=1;j<=5;j++)
        ListInsert(&La,j,j);
    printf("La=");
    for(j=1;j<=5;j++)
    {
        GetElem(La,j,&e);
        printf("%d ",e);
    }
    printf("\n");
    InitList(&Lb);
    for(j=1;j<=5;j++)
        ListInsert(&Lb,j,2*j);
    printf("Lb=");
    for(j=1;j<=5;j++)
    {
        GetElem(Lb,j,&e);
        printf("%d ",e);
    }
    printf("\n");
    MergeList(&La,&Lb,&Lc);
    printf("Lc=");
    c=Lc->next;
    while(c)
    {
        printf("%d ",c->data);
        c=c->next;
    }
    printf("\n");

}

程序运行结果如下:

技术分享

2.8~2.12带头节点的链表的基本操作

标签:

原文地址:http://www.cnblogs.com/moya-com/p/4555795.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!