數據結構實驗報告-實驗一 順序表、單鏈表基本操作的實現


實驗一    順序表、單鏈表基本操作的實現

 

實驗目的

1、順序表

(1)掌握線性表的基本運算。

(2)掌握順序存儲的概念,學會對順序存儲數據結構進行操作。

(3)加深對順序存儲數據結構的理解,逐步培養解決實際問題的編程能力。

 

實驗內容

1、 順序表

1、編寫線性表基本操作函數:

(1)InitList(LIST *L,int ms)初始化線性表;

(2)InsertList(LIST *L,int item,int rc)向線性表的指定位置插入元素;                         

(3)DeleteList1(LIST *L,int item)刪除指定元素值的線性表記錄;

(4)DeleteList2(LIST *L,int rc)刪除指定位置的線性表記錄;

(5)FindList(LIST *L,int item)查找線性表的元素;

(6)OutputList(LIST *L)輸出線性表元素;

2、調用上述函數實現下列操作:

(1)初始化線性表;

(2)調用插入函數建立一個線性表;

(3)在線性表中尋找指定的元素;

(4)在線性表中刪除指定值的元素;

(5)在線性表中刪除指定位置的元素;

(6)遍歷並輸出線性表;

 

實驗結果

1、順序表

(1)流程圖

 
   

 

 

 

 

(2)程序運行主要結果截圖

 

 

 

 

 

 

(3)程序源代碼

#include<stdio.h>

#include<stdlib.h>

#include<malloc.h>

struct LinearList/*定義線性表結構*/

{

    int *list;       /*存線性表元素*/

    int size;        /*存線性表長度*/

    int Maxsize;     /*存list數組元素的個數*/

};

typedef struct LinearList LIST;

void InitList(LIST *L,int ms)/*初始化線性表*/

{

    if((L->list=(int*)malloc(ms*sizeof(int)))==NULL)

       {

           printf("內存申請錯誤");

             exit(1);

       }

       L->size=0;

    L->Maxsize=ms;

}

int InsertList(LIST *L,int item,int rc)/*item記錄值;rc插入位置*/

{

    int i;

    if(L->size==L->Maxsize)/*線性表已滿*/

       return -1;

    if(rc<0)

        rc=0;

    if(rc>L->size)

        rc=L->size;

    for(i=L->size-1;i>=rc;i--)/*將線性表元素后移*/

       L->list[i+=1]=L->list[i];

       L->list[rc]=item;

       L->size++;

       return 0;

}

void OutputList(LIST *L)/*輸出線性表元素*/

{

    int i;

    for(i=0;i<L->size;i++)

        printf("%d",L->list[i]);

        printf("\n");

}

int FindList(LIST *L,int item)/*查找線性元素,返回值>=0為元素的位置,返回-1為沒找到*/

{

    int i;

    for(i=0;i<L->size;i++)

        if(item==L->list[i])

        return i;

    return -1;

}

int DeleteList1(LIST *L,int item)/*刪除 指定元素值得線性表記錄,返回值為>=0為刪除成功*/

{

    int i,n;

    for(i=0;i<L->size;i++)

        if(item==L->list[i])

        break;

    if(i<L->size)

    {

        for(n=i;n<L->size-1;n++)

            L->list[n]=L->list[n+1];

        L->size--;

        return i;

    }

    return -1;

}

int DeleteList2(LIST *L,int rc)/*刪除指定位置的線性表記錄*/

{

    int i,n;

    if(rc<0||rc>=L->size)

        return -1;

    for(n=rc;n<L->size-1;n++)

    L->list[n]=L->list[n+1];

    L->size--;

    return 0;

}

int main()

{

    LIST LL;

       int i,r;

       printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.size,LL.Maxsize);

       InitList(&LL,10);

       printf("list addr=%p\tsize=%d\tMaxsize=%d\n",LL.list,LL.list,LL.Maxsize);

 

       while(1)

       {

           printf("請輸入元素值,輸入0結束插入操作:");

           fflush(stdin);/*清空標准輸入緩沖區*/

           scanf("%d",&i);

           if(i==0)

            break;

           printf("請輸入插入位置:");

           scanf("%d",&r);

           InsertList(&LL,i,r-1);

           printf("線性表為:");

           OutputList(&LL);

       }

       while(1)

       {

           printf("請輸入查找元素值,輸入0結束查找操作:");

           fflush(stdin);/*清空標准輸入緩沖區*/

           scanf("%d ",&i);

           if(i==0)

            break;

           r=FindList(&LL,i);

           if(r<0)

            printf("沒有找到\n");

           else

             printf("有符合條件的元素,位置為:%d\n",r+1);

       }

       while(1)

       {

           printf("請輸入刪除元素值,輸入0結束查找操作:");

           fflush(stdin);/*清楚標准緩存區*/

           scanf("%d",&i);

           if(i==0)

            break;

           r=DeleteList1(&LL,i);

            if(i<0)

                printf("沒有找到\n");

            else{

                printf("有符合條件的元素,位置為:%d\n線性表為:",r+1);

                OutputList(&LL);

            }

        }

        while(1)

       {

           printf("請輸入刪除元素位置,輸入0結束查找操作:");

           fflush(stdin);/*清楚標准輸入緩沖區*/

           scanf("%d",&r);

           if(r==0)

            break;

           i=DeleteList2(&LL,r-1);

           if(i<0)

            printf("位置越界\n");

           else

           {

               printf("線性表為:");

               OutputList(&LL);

           }

       }

}

 

 

鏈表基本操作

實驗目的

2、鏈表

(1)掌握鏈表的概念,學會對鏈表進行操作。

(2)加深對鏈式存儲數據結構的理解,逐步培養解決實際問題的編程能力。

 

實驗內容

  1、編寫鏈表基本操作函數:

(1)InitList(LIST *L,int ms)初始化鏈表;

(2)InsertList1(LIST *L,int item,int rc)向鏈表的指定位置插入元素;

(3)InsertList2(LIST *L,int item,int rc)向有序鏈表的指定位置插入元素;

(4)DeleteList(LIST *L,int item)刪除指定元素值的鏈表記錄;

(5)FindList(LIST *L,int item)查找鏈表中的元素;

(6)OutputList(LIST *L)輸出鏈表中的元素;

2、調用上述函數實現下列操作:

(1)初始化鏈表;

(2)調用插入函數建立一個鏈表;

(3)在鏈表中尋找指定的元素;

(4)在鏈表中刪除指定值的元素;

(5)遍歷並輸出鏈表;

 

實驗結果

(1)、流程圖:

 

 

 

 

 

 

 

 

 

 

(2)程序運行主要結果截圖:

 

 

 

 

 

 

 

 

(3)程序源代碼:

#include<stdio.h>

#include<malloc.h>

typedef struct list

{

    int data;

    struct list *next;

}LIST;

void initlist(LIST **p)

{

    *p=NULL;

}

void insertlist1(LIST **p,int item,int rc)

{

    int i;

    LIST *u,*q,*r;

    u=(LIST*)malloc(sizeof(LIST));

    u->data=item;

    for(i=1,r=*p;i<rc&&r!=NULL;i++)

    {

        q=r;

        r=r->next;

    }

    if(r==*p)

        *p=u;

    else

        q->next=u;

        u->next=r;

}

void insertlist2(LIST **p,int item)

{

    LIST *u,*q,*r;

    u=(LIST*)malloc(sizeof(LIST));

    u->data=item;

    for(r=*p;r!=NULL&&r->data<item; q=r,r=r->next)

       if(r==*p)

         *p=u;

       else

           q->next=u;

           u->next=r;

 

}

int deletelist(LIST **p,int item)

{

    LIST *q,*r;

    q=*p;r=q;

    if(q==NULL)

        return 1;

    if(q->data==item)

    {

        *p=q->next;

        free(r);

        return 0;

    }

    for( ;q->data!=item&&q->next!=NULL;r=q,q=q->next)

    if(q->data==item)

    {

        r->next=q->next;

        free(q);

        return 0;

    }

    return 1;

}

int findlist(LIST *p,int item)

{

    int i;

    for(i=1;p->data!=item&&p!=NULL;p=p->next,i++)

    return(p==NULL)?-1:i;

}

void outputlist(LIST *p)

{

    while(p!=NULL)

    {

        printf("%4d",p->data);

        p=p->next;

    }

    printf("\n");

}

void freelist(LIST **p)

{

    LIST *q,*r;

    for(q=*p;q!=NULL;)

    {

        r=q;

        q=q->next;

        free(r);

    }

    *p=NULL;

}

int main()

{

    LIST *p;

    int op,i,rc;

    initlist(&p);

    while(1)

    {

        printf("---------------\n");

        printf("- 1:指定位置追加\n");

        printf("- 2:升序追加\n");

        printf("- 3:查找結點\n");

        printf("- 4:刪除結點\n");

        printf("- 5:輸出鏈表\n");

        printf("- 6:清空鏈表\n");

        printf("- 0:退出\n");

        printf("--------------\n");

        printf("請輸入0~6 進行操作:");

        fflush(stdin);

        scanf("%d",&op);

        switch(op)

        {

        case 0:

            return -1;

        case 1:

            printf("請輸入新增結點的鍵值和位置:");

            scanf("%d%d",&i,&rc);

            insertlist1(&p,i,rc);

            break;

        case 2:

            printf("請輸入新增結點的鍵值:");

            scanf("%d",&i);

            insertlist2(&p,i);

            break;

        case 3:

            printf("請輸入要查找結點的鍵值:");

            scanf("%d",&i);

            rc=findlist(p,i);

            if(rc>0)

               printf("  位置位 %d\n",rc);

            else

                printf("沒有找到\n");

            break;

        case 4:

            printf("請輸入要刪除的結點的鍵值:");

            scanf("%d",&i);

            rc=deletelist(&p,i);

            if(rc==0)

                printf("刪除成功!\n",rc);

            else

                printf("沒找到!\n");

            break;

        case 5:

            printf("\n 鏈表內容為:\n");

            outputlist(p);

            break;

        case 6:

            freelist(&p);

            break;

        }

    }

}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM