单链表应用问题--课本素材

来源:互联网 发布:淘宝信誉刷到皇冠 编辑:程序博客网 时间:2024/05/16 12:55

1. 设计算法,拆分单链表

源代码:

#include <stdio.h>#include <malloc.h>typedef int ElemType;typedef struct LNode{    ElemType data;    struct LNode *next;} LinkList;void CreateListR(LinkList *&l,ElemType a[],int n){    LinkList *s,*r;    int i;    l=(LinkList *)malloc(sizeof(LinkList));    r=l;    for(i=0;i<n;i++)    {        s=(LinkList *)malloc(sizeof(LinkList));        s->data=a[i];        r->next=s;        r=s;    }    r->next=NULL;}void DispList(LinkList *l){    LinkList *p=l->next;    while(p!=NULL)    {        printf("%d ",p->data);        p=p->next;    }    printf("\n");}void Split(LinkList *l,LinkList *&l1,LinkList *&l2){    LinkList *p=l->next,*q,*r;    l1=l;    r=l;    l2=(LinkList *)malloc(sizeof(LinkList));    l2->next=NULL;    while(p!=NULL)    {        r->next=p;        r=p;        p=p->next;        q=p->next;        p->next=l2->next;        l2->next=p;        p=q;    }    r->next=NULL;}int main(){    ElemType a[1000];    LinkList *l,*l1,*l2;    int i,n;    printf("请输入节点数:\n");    scanf("%d",&n);    printf("请输入各节点元素:\n");    for(i=0;i<n;i++)        scanf("%d",&a[i]);    CreateListR(l,a,n);    printf("拆分前单链表中各节点为:\n");    DispList(l);    Split(l,l1,l2);    printf("拆分后单链表中各节点为:\n");    DispList(l1);    DispList(l2);    return 0;}

运行结果:


2. 设计算法,删除一个单链表中元素值最大的节点

源代码:

#include <stdio.h>#include <malloc.h>typedef int ElemType;typedef struct LNode{    ElemType data;    struct LNode *next;} LinkList;void CreateListR(LinkList *&l,ElemType a[],int n){    LinkList *s,*r;    int i;    l=(LinkList *)malloc(sizeof(LinkList));    r=l;    for(i=0;i<n;i++)    {        s=(LinkList *)malloc(sizeof(LinkList));        s->data=a[i];        r->next=s;        r=s;    }    r->next=NULL;}void DispList(LinkList *l){    LinkList *p=l->next;    while(p!=NULL)    {        printf("%d ",p->data);        p=p->next;    }    printf("\n");}void Deletemaxnode(LinkList *&l){    LinkList *pre,*p,*q;    LinkList *maxpre,*maxp;    pre=l;    p=l->next;    q=l->next;    maxpre=pre;    maxp=p;    while(p!=NULL)    {        if(maxp->data<p->data)        {            maxp=p;            maxpre=pre;        }        pre=p;        p=p->next;    }    maxpre->next=maxp->next;    free(maxp);}int main(){    ElemType a[1000];    LinkList *l;    int i,n;    printf("请输入节点数:\n");    scanf("%d",&n);    printf("请输入各节点元素:\n");    for(i=0;i<n;i++)        scanf("%d",&a[i]);    CreateListR(l,a,n);    printf("删除前单链表中各节点为:\n");    DispList(l);    Deletemaxnode(l);    printf("删除后单链表中各节点为:\n");    DispList(l);    return 0;}

运行结果:


3. 有一个带头节点的单链表L(数据节点至少一个),设计算法使其元素递增有序排列

源代码:

#include <stdio.h>#include <malloc.h>typedef int ElemType;typedef struct LNode{    ElemType data;    struct LNode *next;} LinkList;void CreateListR(LinkList *&l,ElemType a[],int n){    LinkList *s,*r;    int i;    l=(LinkList *)malloc(sizeof(LinkList));    r=l;    for(i=0;i<n;i++)    {        s=(LinkList *)malloc(sizeof(LinkList));        s->data=a[i];        r->next=s;        r=s;    }    r->next=NULL;}void DispList(LinkList *l){    LinkList *p=l->next;    while(p!=NULL)    {        printf("%d ",p->data);        p=p->next;    }    printf("\n");}void Sort(LinkList *&l){    LinkList *pre,*p,*q;    p=l->next->next;    l->next->next=NULL;    while(p!=NULL)    {        q=p->next;        pre=l;        while(pre->next!=NULL && pre->next->data<p->data)            pre=pre->next;        p->next=pre->next;        pre->next=p;        p=q;    }}int main(){    ElemType a[1000];    LinkList *l;    int i,n;    printf("请输入节点数:\n");    scanf("%d",&n);    printf("请输入各节点元素:\n");    for(i=0;i<n;i++)        scanf("%d",&a[i]);    CreateListR(l,a,n);    Sort(l);    printf("排序后单链表中各节点为:\n");    DispList(l);    return 0;}

程序截图:


0 0
原创粉丝点击