數據結構->單鏈表的操作

1、隨機產生或鍵盤輸入一組元素,建立一個帶頭結點的單向鏈表(無序)。

2、遍歷單向鏈表。

3、把單向鏈表中元素逆置(不允許申請新的結點空間)。

4、在單向鏈表中刪除所有的偶數元素結點。

5、編寫在非遞減有序鏈表中插入一個元素使鏈表元素仍有序的函數,並利用該函數建立一個非遞減有序單向鏈表。

6、利用算法5建立兩個非遞減有序單向鏈表,然後合併成一個非遞增鏈表。

7、利用算法5建立兩個非遞減有序單向鏈表,然後合併成一個非遞減鏈表。

8、編寫一個主函數,調試上述算法。

#include <stdio.h>
#include <stdlib.h>
#define Elemtype int
typedef 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;
}


發佈了89 篇原創文章 · 獲贊 25 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章