程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 數據結構試驗 順序表

數據結構試驗 順序表

編輯:C++入門知識

編寫一個完整的程序,實現順序表的建立、插入、刪除、輸出等基本運算。
(1) 建立一個順序表,含有n個數據元素。

(2) 輸出順序表及順序表的長度。

(3) 在順序表中刪除值為x的結點或者刪除給定位置i的結點。

(4) 將順序表就地逆置,即利用原表的存儲空間將線性表(a1,a2,...,an)逆置為(an,an-1,...,a1)。

(5) 將順序表按升序排序。

(6) 設順序表中的數據元素遞增有序,將x插入到順序表的適當位置上,以保持該表的有序性。

(7) 將兩個順序有序表A和B合並為一個有序表C。

在主函數中設計一個簡單的菜單,分別測試上述算法


[cpp]  //因為之前沒有寫過這樣的操作菜單,所以很多地方沒做好。比如說輸入輸出的數據沒有對齊,整個排版看起來有些擁擠,每一次操作都會輸出一次菜單。  
//實驗目的是測試各個函數的作用,寫的時候除了創建順序表的函數,其他函數後面我都加了一個輸出函數,將按要求改變後的順序表直接輸出了。  
//我將a、b、c數組和n、m都設置成了全局變量,方便代碼的操作。  
//因為創建函數沒有設置形參,在合並數組的時候,我是先將a數組賦值給b數組,數組合並後將c數組再復制給a數組輸出。這個是我事先沒考慮到,下次改進。  
//輸出菜單可以放在函數裡面,主函數中的代碼看起來會簡潔很多,之前也沒想到。  
//寫完之後發現把刪除數據的函數給漏掉了,後面又加上了。  
//測試數據:a數組:5   2 5 3 4 1   
//插入元素:第3位 7  
//b數組:7    8 9 10 11 12 13 14  
//刪除數據: 第3位  
#include<stdio.h>  
#define N 105  
int a[N],b[N],c[N*2]; 
int n,m; 
void Creatlist()//創建函數  

    int i; 
    printf("輸入數據數量:     "); 
    scanf("%d",&n); 
    printf("輸入數據:         "); 
    for(i=0;i<n;i++) 
        scanf("%d",&a[i]); 
    return ; 

void Printlist()//打印函數  

    int i; 
    printf("順序表長度n:   %d\n",n); 
    printf("順序表:        "); 
    for(i=0;i<n;i++) 
        printf("%d ",a[i]); 
    printf("\n"); 
    return ; 

void Inverlist()//逆序函數,逆序後直接輸出  

    int r,l; 
    int temp; 
    for(l=0,r=n-1;l<=r;l++,r--) 
    { 
        temp=a[r]; 
        a[r]=a[l]; 
        a[l]=temp; 
    } 
    Printlist(); 
    return ; 

void Sortlist()//排序函數,用的是冒泡排序,因為不是實驗重點,也就沒太注意效率的問題。  

    int i,j; 
    int temp; 
    for(i=n-1;i>=1;i--) 
    { 
        for(j=0;j<i;j++) 
            if(a[j]>a[j+1]) 
            { 
                temp=a[j]; 
                a[j]=a[j+1]; 
                a[j+1]=temp; 
            } 
    } 
    Printlist(); 
    return ; 

void Insertlist()//插入函數  

    int x,y; 
    int temp0,temp1; 
    int i; 
    printf("插入數據的位置:    "); 
    scanf("%d",&x); 
    printf("插入數據的數值:    "); 
    scanf("%d",&y); 
    temp0=a[x-1]; 
    a[x-1]=y; 
    for(i=x;i<n;i++) 
    { 
        temp1=a[i]; 
        a[i]=temp0; 
        temp0=temp1; 
    } 
    a[i]=temp0; 
    n++; 
    Printlist(); 
    return ; 

void Comlist()//合並函數,在這個函數中重新輸入了一個數組  

    int i,j,k; 
    for(i=0;i<n;i++) 
        b[i]=a[i]; 
    m=n; 
    Creatlist(); 
    i=j=k=0; 
    while(i<n||j<m) 
    { 
        if(a[i]<b[j]&&i<n&&j<m) 
        { 
            c[k++]=a[i]; 
            i++; 
        } 
        else if(a[i]>=b[j]&&i<n&&j<m) 
        { 
            c[k++]=b[j]; 
            j++; 
        } 
        else if(i==n) 
        { 
            c[k++]=b[j]; 
            j++; 
        } 
        else  
        { 
            c[k++]=a[i]; 
            i++; 
        } 
    } 
    for(i=0;i<k;i++) 
        a[i]=c[i]; 
    n=k; 
    Printlist(); 
    return ; 

void Delelist() 

    int x; 
    int i; 
    printf("需要刪除的數據的位置:  "); 
    scanf("%d",&x); 
    a[x-1]=a[x]; 
    for(i=x;i<n-1;i++) 
        a[i]=a[i+1]; 
    n--; 
    Printlist(); 
    return ; 

int main() 

    int T; 
    int flag; 
    flag=1; 
    while(1)//永真循環,在輸入0是跳出  
    { 
        printf("*********目錄*********\n"); 
        printf("創建一個順序表:      1\n"); 
        printf("輸出順序表及其長度:  2\n"); 
        printf("將順序表逆置:        3\n"); 
        printf("將順序表升序排序:    4\n"); 
        printf("將一個值插入順序表:  5\n"); 
        printf("將兩個有序表合並輸出:6\n"); 
        printf("刪除表中的某個元素:  7\n"); 
        printf("結束操作:            0\n"); 
        printf("請輸入操作代碼:      "); 
        scanf("%d",&T); 
        switch(T) 
        { 
            case 1:Creatlist();break; 
            case 2:Printlist();break; 
            case 3:Inverlist();break; 
            case 4:Sortlist();break; 
            case 5:Insertlist();break; 
            case 6:Comlist();break; 
            case 7:Delelist();break; 
            case 0:flag=0;break; 
            default:printf("輸入錯誤,請重新輸入!\n");break;//輸入數據不合法  
        } 
        printf("\n"); 
        if(!flag) 
            break; 
    } 
    printf("謝謝使用!\n"); 
    return 0; 

//因為之前沒有寫過這樣的操作菜單,所以很多地方沒做好。比如說輸入輸出的數據沒有對齊,整個排版看起來有些擁擠,每一次操作都會輸出一次菜單。
//實驗目的是測試各個函數的作用,寫的時候除了創建順序表的函數,其他函數後面我都加了一個輸出函數,將按要求改變後的順序表直接輸出了。
//我將a、b、c數組和n、m都設置成了全局變量,方便代碼的操作。
//因為創建函數沒有設置形參,在合並數組的時候,我是先將a數組賦值給b數組,數組合並後將c數組再復制給a數組輸出。這個是我事先沒考慮到,下次改進。
//輸出菜單可以放在函數裡面,主函數中的代碼看起來會簡潔很多,之前也沒想到。
//寫完之後發現把刪除數據的函數給漏掉了,後面又加上了。
//測試數據:a數組:5   2 5 3 4 1
//插入元素:第3位 7
//b數組:7    8 9 10 11 12 13 14
//刪除數據: 第3位
#include<stdio.h>
#define N 105
int a[N],b[N],c[N*2];
int n,m;
void Creatlist()//創建函數
{
 int i;
 printf("輸入數據數量:     ");
 scanf("%d",&n);
 printf("輸入數據:         ");
 for(i=0;i<n;i++)
  scanf("%d",&a[i]);
 return ;
}
void Printlist()//打印函數
{
 int i;
 printf("順序表長度n:   %d\n",n);
 printf("順序表:        ");
 for(i=0;i<n;i++)
  printf("%d ",a[i]);
 printf("\n");
 return ;
}
void Inverlist()//逆序函數,逆序後直接輸出
{
 int r,l;
 int temp;
 for(l=0,r=n-1;l<=r;l++,r--)
 {
  temp=a[r];
  a[r]=a[l];
  a[l]=temp;
 }
 Printlist();
 return ;
}
void Sortlist()//排序函數,用的是冒泡排序,因為不是實驗重點,也就沒太注意效率的問題。
{
 int i,j;
 int temp;
 for(i=n-1;i>=1;i--)
 {
  for(j=0;j<i;j++)
   if(a[j]>a[j+1])
   {
    temp=a[j];
    a[j]=a[j+1];
    a[j+1]=temp;
   }
 }
 Printlist();
 return ;
}
void Insertlist()//插入函數
{
 int x,y;
 int temp0,temp1;
 int i;
 printf("插入數據的位置: ");
 scanf("%d",&x);
 printf("插入數據的數值: ");
 scanf("%d",&y);
 temp0=a[x-1];
 a[x-1]=y;
 for(i=x;i<n;i++)
 {
  temp1=a[i];
  a[i]=temp0;
  temp0=temp1;
 }
 a[i]=temp0;
 n++;
 Printlist();
 return ;
}
void Comlist()//合並函數,在這個函數中重新輸入了一個數組
{
 int i,j,k;
 for(i=0;i<n;i++)
  b[i]=a[i];
 m=n;
 Creatlist();
 i=j=k=0;
 while(i<n||j<m)
 {
  if(a[i]<b[j]&&i<n&&j<m)
  {
   c[k++]=a[i];
   i++;
  }
  else if(a[i]>=b[j]&&i<n&&j<m)
  {
   c[k++]=b[j];
   j++;
  }
  else if(i==n)
  {
   c[k++]=b[j];
   j++;
  }
  else
  {
   c[k++]=a[i];
   i++;
  }
 }
 for(i=0;i<k;i++)
  a[i]=c[i];
 n=k;
 Printlist();
 return ;
}
void Delelist()
{
 int x;
 int i;
 printf("需要刪除的數據的位置:  ");
 scanf("%d",&x);
 a[x-1]=a[x];
 for(i=x;i<n-1;i++)
  a[i]=a[i+1];
 n--;
 Printlist();
 return ;
}
int main()
{
 int T;
 int flag;
 flag=1;
 while(1)//永真循環,在輸入0是跳出
 {
  printf("*********目錄*********\n");
  printf("創建一個順序表:      1\n");
  printf("輸出順序表及其長度:  2\n");
  printf("將順序表逆置:        3\n");
  printf("將順序表升序排序:    4\n");
  printf("將一個值插入順序表:  5\n");
  printf("將兩個有序表合並輸出:6\n");
  printf("刪除表中的某個元素:  7\n");
  printf("結束操作:            0\n");
  printf("請輸入操作代碼:      ");
  scanf("%d",&T);
  switch(T)
  {
   case 1:Creatlist();break;
   case 2:Printlist();break;
   case 3:Inverlist();break;
   case 4:Sortlist();break;
   case 5:Insertlist();break;
   case 6:Comlist();break;
   case 7:Delelist();break;
   case 0:flag=0;break;
   default:printf("輸入錯誤,請重新輸入!\n");break;//輸入數據不合法
  }
  printf("\n");
  if(!flag)
   break;
 }
 printf("謝謝使用!\n");
 return 0;
}

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved