資料結構實驗報告 鏈表

來源:互聯網
上載者:User
一、實驗目的

(1)掌握線性表的基本運算在兩種儲存結構(順序結構和鏈式結構)上的實現;
(2)掌握線性表的各種操作(建立、插入、刪除等)的實現演算法; 二、實驗儀器及環境:

PC電腦 windows 7作業系統 CodeBlocks10.05 三、實驗內容及結果(按照具體實驗題目,按照如下格式書寫)

1.隨機產生或鍵盤輸入一組元素,建立一個帶頭結點的單向鏈表(無序)。
2.遍曆單向鏈表。
3.把單向鏈表中元素逆置(不允許申請新的結點空間)。
4.在單向鏈表中刪除所有的偶數元素結點。
5.編寫在非遞減有序鏈表中插入一個元素使鏈表元素仍有序的函數,並利用該函數建立一個非遞減有序單向鏈表。
6.利用演算法5建立兩個非遞減有序單向鏈表,然後合并成一個非遞增鏈表。
7.利用演算法5建立兩個非遞減有序單向鏈表,然後合并成一個非遞減鏈表。
8.利用演算法1建立的鏈表,實現將其分解成兩個鏈表,其中一個全部為奇數,另一個全部為偶數(盡量利用已知的儲存空間)。
10.在主函數中設計一個簡單的菜單,分別調試上述演算法。

#include <iostream>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <algorithm>#define MAXASIZE 100typedef int ElemType;typedef struct LNode{    ElemType data;    struct LNode *next;} LNode,*LinkList;using namespace std;//1.隨機產生或鍵盤輸入一組元素,建立一個帶頭結點的單向鏈表(無序)。LinkList creat()//建立一個帶前端節點的鏈表{    printf("Please Input a List of Numbers: ");    LinkList p1,p2,head;    head=(LNode *)malloc(sizeof(LNode));    head->next=NULL;    p1=head;    ElemType x;    while(scanf("%d",&x)!=-1)    {        p2=(LNode *)malloc(sizeof(LNode));        p2->data=x;        p1->next=p2;        p1=p2;    }    p1->next=NULL;    return head;}//2.遍曆單向鏈表。void display(LinkList head)//遍曆{    LinkList p;    p=head->next;    printf("HEAD -> ");    while(p!=NULL)    {        printf("%d -> ",p->data);        p=p->next;    }    printf("TAIL\n");}void InsertList(LinkList head,ElemType x)//插入x{    //printf("Please Input the Location and the Number which You Want to Insert: ");    LinkList l=head,p1,p2;    l=head;    bool flag=0;    if (l->next->data>x)//隊首    {        p2=(LNode *)malloc(sizeof(LNode));        p2->data=x;        p2->next=l->next;        l->next=p2;        return;    }    while(l->next)    {        l=l->next;        p1=l;        //flag=0;//flag=0表示尚未插入        if (p1->data<=x && p1->next->data>=x)//插入在p1與p1->next中間        {            p2=(LNode *)malloc(sizeof(LNode));            p2->data=x;            p2->next=p1->next;            p1->next=p2;            flag=1;//已插入            break;        }    }    if (!flag)    {        p2=(LNode *)malloc(sizeof(LNode));        p2->data=x;        p2->next=NULL;        l->next=p2;    }}LinkList CreateNew(LinkList head)//構建非遞減有序單向鏈表;{    LinkList l,p1,p2=head;    l=(LNode *)malloc(sizeof(LNode));    l->next=NULL;    ElemType x;    p2=head->next;    while(p2)    {        x=p2->data;        p1=(LNode *)malloc(sizeof(LNode));        p1->data=x;        p1->next=l->next;        l->next=p1;        p2=p2->next;    }    return l;}//3.把單向鏈表中元素逆置(不允許申請新的結點空間)。LinkList ReverseList(LinkList head)//逆置鏈表{    LinkList p1,p2;    if (head->next==NULL) return head;    p1=head->next;    head->next=NULL;    while(p1)    {        p2=p1;        p1=p1->next;        p2->next=head->next;        head->next=p2;    }    return head;}ElemType LengthList(LinkList head){    LinkList p;    p=head->next;    int num=0;    while(p!=NULL)    {        p=p->next;        num++;    }    return num;}//5.編寫在非遞減有序鏈表中插入一個元素使鏈表元素仍有序的函數,並利用該函數建立一個非遞減有序單向鏈表。LinkList SortList(LinkList head)//排序為非減鏈表{    LinkList p;    if (head->next == NULL) return head;    int n=LengthList(head);    for(int i=1; i<n; i++)    {        p=head->next;        for(int j=0; j<n-1; j++)        {            if (p->data > p->next->data)            {                ElemType tmp=p->data;                p->data=p->next->data;                p->next->data=tmp;            }            p=p->next;        }    }    return head;}//4.在單向鏈表中刪除所有的偶數元素結點。LinkList DeleteEven(LinkList head)//刪除偶數元素節點{    LinkList p1,p2;    p1=head;    p2=p1->next;    while(p1->next)    {        if ((p2->data & 1)==0)        {            p1->next=p2->next;            free(p2);            p2=p1->next;        }        else        {            p2=p2->next;            p1=p1->next;        }    }    return head;}//7.利用演算法5建立兩個非遞減有序單向鏈表,然後合并成一個非遞減鏈表。void MergeList1(LinkList &head,LinkList &l)//合并兩個鏈表,遞增排列{    LinkList p=head;    while(p->next!=NULL)    {        p=p->next;        InsertList(l,p->data);    }    CreateNew(l);}//6.利用演算法5建立兩個非遞減有序單向鏈表,然後合并成一個非遞增鏈表。void MergeList2(LinkList &head,LinkList &l)//合并兩個鏈表,遞減排列{    LinkList p=head;    while(p->next!=NULL)    {        p=p->next;        InsertList(l,p->data);    }    CreateNew(l);    ReverseList(l);}//8.利用演算法1建立的鏈表,實現將其分解成兩個鏈表,其中一個全部為奇數,另一個全部為偶數(盡量利用已知的儲存空間)void divide(LinkList head)//分為左右兩部分,左邊的元素為奇數,右邊所有元素為偶數{    LinkList L=head,p,q,r,s;    r=L;    p=L->next;    int j=0;    while(p!=NULL)    {        s=p;//s為最後一個節點;        p=p->next;        j++;    }    r=L;    p=L->next;    q=p->next;    for(int i=0; i<j-1; i++)    {        if((p->data)%2==0)        {            r->next=q;            p->next=NULL;            s->next=p;            s=p;            p=q;            q=p->next;        }        else        {            r=p;            p=q;            q=p->next;        }    }}void depart(LinkList head,LinkList l){    LinkList q=head,p;    q=q->next;    while(q->data%2==1)    {        ElemType x;        x=q->data;        p=(LinkList)malloc(sizeof(LNode));        p->data=x;        p->next=l->next;        l->next=p;        head->next=q->next;        free(q);        q=head->next;    }}void freelist(LinkList head)//釋放鏈資料表空間{    LinkList l=head;    LinkList q;    while(l)    {        q=l;        l=l->next;        free(q);    }}void swap(LinkList head)//交換值的排序{    LinkList l=head,p,q;    p=l->next;    int j=0;    while(p)    {        p=p->next;        j++;    }    for(int i=0; i<j; i++)    {        q=l->next;        for(int k=i; k<j-1; k++)        {            p=q;            q=p->next;            if(p->data > q->data)            {                int tmp;                tmp=p->data;                p->data=q->data;                q->data=tmp;            }        }    }}int main(){    LinkList head=creat();//顯示    display(head);//排序    LinkList head2=SortList(head);    display(head2);//合并鏈表1    MergeList1(head,head2);//合并鏈表2    MergeList2(head,head2);    display(head2);//鏈表插入元素    int  tt;    scanf("%d",&tt);    InsertList(head,tt);    display(head);//逆置鏈表    ReverseList(head);    display(head);//刪除偶數元素    DeleteEven(head);    display(head);//按奇偶分解鏈表    divide(head);    LinkList l;    l=(LinkList)malloc(sizeof(LNode));    l->next=NULL;    depart(head,l);    display(head);    display(l);    return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.