数据结构->单链表的操作

来源:互联网 发布:淘宝访问量怎么提高 编辑:程序博客网 时间:2024/05/16 08:55

1、随机产生或键盘输入一组元素,建立一个带头结点的单向链表(无序)。

2、遍历单向链表。

3、把单向链表中元素逆置(不允许申请新的结点空间)。

4、在单向链表中删除所有的偶数元素结点。

5、编写在非递减有序链表中插入一个元素使链表元素仍有序的函数,并利用该函数建立一个非递减有序单向链表。

6、利用算法5建立两个非递减有序单向链表,然后合并成一个非递增链表。

7、利用算法5建立两个非递减有序单向链表,然后合并成一个非递减链表。

8、编写一个主函数,调试上述算法。

#include <stdio.h>#include <stdlib.h>#define Elemtype inttypedef struct node{    Elemtype data;    struct node *next;} Lnode;void creat(Lnode *h){    int data;    Lnode *p=h,*pp;    scanf("%d",&data);    while(data!=-1)    {        pp=(Lnode*)malloc(sizeof(Lnode));        pp->next=NULL;        pp->data=data;        p->next=pp;        p=pp;        scanf("%d",&data);    }}void bianli(Lnode *h){    h=h->next;    while(h!=NULL)    {        printf("%d ",h->data);        h=h->next;    }    puts("");}void nizhi(Lnode *h){    Lnode *p1=h,*p2;    p1=h->next;    h->next=NULL;    while(p1!=NULL)    {        p2=p1;        p1=p1->next;        p2->next=NULL;        p2->next=h->next;        h->next=p2;    }}void deleted(Lnode *h){    Lnode *p1,*p2;    p1=h;    p2=h->next;    while(p2!=NULL)    {        if(p2->data%2==0)        {            p1->next=p2->next;            free(p2);            p2=p1->next;        }        else        {            p1=p2;            p2=p2->next;        }    }}void charu(Lnode *h,Lnode *tt){    Lnode *ll=h->next,*ss=h;    if(h->next==NULL)    {        h->next=tt;        return;    }    while(ll->data<tt->data&&ll->next!=NULL)    {        // printf("%d\n",ll->data);        ss=ll;        ll=ll->next;    }    if(ll->next!=NULL)    {        tt->next=ss->next;        ss->next=tt;    }    else    {        if(ll->data>tt->data)        {            tt->next=ss->next;            ss->next=tt;        }        else        {            tt->next=ll->next;            ll->next=tt;        }    }}/*void creat2(Lnode *h){    int data,f=0;   Lnode *p=h,*pp,*ll=h->next,*ss=h;   scanf("%d",&data);   while(data!=-1)    {        pp=(Lnode*)malloc(sizeof(Lnode));        pp->next=NULL;        pp->data=data;        if(h->next==NULL)        {        p->next=pp;        p=pp;        }      else        for(ll=h->next,ss=h;ll!=NULL;ll=ll->next)        {  printf("*%d\n",ll->data);            if(ll->data<data)               continue;            else            {                pp->next=ss->next;                ss->next=pp;                break;            }            ss=ll;        }          else        {             while(ll->data<=data)        {            ss=ll;            ll=ll->next;        }            pp->next=ss->next;            ss->next=pp;        }        ll=h->next;        ss=h;    scanf("%d",&data);    }}*/void creat2(Lnode *h){    int data;    Lnode *p=h,*pp;    scanf("%d",&data);    while(data!=-1)    {        pp=(Lnode*)malloc(sizeof(Lnode));        pp->next=NULL;        pp->data=data;        charu(p,pp);        scanf("%d",&data);    }}void hebing(Lnode *h1,Lnode *h2){    Lnode *p1,*p2;   p1=h2->next;    while(p1!=NULL)    {       p2=p1;           p1=p1->next;        charu(h1,p2);    }}int main(){      Lnode *h=(Lnode*)malloc(sizeof(Lnode));       h->next=NULL;       creat(h);       printf("遍历结果:");       bianli(h);       nizhi(h);       printf("逆置结果:");       bianli(h);       deleted(h);       printf("删除结果:");       bianli(h);       Lnode *tt=(Lnode*)malloc(sizeof(Lnode));       printf("输入插入数:");       scanf("%d",&tt->data);        charu(h,tt);        printf("插入结果:");        bianli(h);    Lnode *h1=(Lnode*)malloc(sizeof(Lnode));    h1->next=NULL;    creat2(h1);    printf("创建非递减有序链表h1结果:");    bianli(h1);    Lnode *h2=(Lnode*)malloc(sizeof(Lnode));    h2->next=NULL;    creat2(h2);    printf("创建非递减有序链表h2结果:");    bianli(h2);    printf("合并结果为:");    hebing(h1,h2);    bianli(h1);    return 0;}