生活随笔
收集整理的這篇文章主要介紹了
【数据结构】线性表的顺序存储结构(c语言实现)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
最近在復習數據結構,參考資料為王道數據結構
/*********************************************************//*Project: sequence_list(數據結構-順序表) Date: 2019/07/22Author: CWSCreatList(SqList &L,int n) 參數:順序表L,順序表長度n 功能:創建長度為的順序表 時間復雜度:O(n)InitList(SqList &L) 參數:順序表L 功能:初始化 時間復雜度:O(1)InsertList(SqList &L,int i,ElemType e) 參數:順序表L,位置i,元素e 功能:位置i處插入元素e 時間復雜度:O(n)ListDelete(SqList &L,int i) 參數:順序表L,位置i 功能:刪除位置i處元素 時間復雜度:O(n)LocateElem(SqList L,ElemType e) 參數:順序表L,元素e 功能:返回第一個等于e的元素的位置 時間復雜度:O(n)PrintList(SqList L) 參數:順序表L 功能:遍歷L,并輸出
*/#include<stdio.h>
#include<string.h>
#define MaxSize 100 //定義線性表的最大長度
#define ElemType int //假定表中元素類型是int
#define Status int//定義一個結構體,表示了順序表的類型
//數組是靜態分配的(大小固定)
typedef struct
{ElemType data[MaxSize]; //順序表的元素(開辟int類型的數組,數組名叫data,數組名就是數組的起始位置,數組大小就是MaxSize)int length; //順序表的當前長度
}SqList; //順序表的類型定義//*******基本操作函數*********////初始化順序表函數,構造一個空的順序表
Status InitList(SqList &L)
{memset(L.data,0,sizeof(L)); //初始化數據為0L.length=0;return 0;
}//創建順序表函數 初始化前n個數據
bool CreatList(SqList &L,int n)
{if(n<0||n>MaxSize)return false; //非法for(int i=0;i<n;i++){scanf("%d",&L.data[i]);L.length++;}return true;
}//插入 順序表插入算法的平均時間復雜度為O(n)
/*
算法流程:
在順序表L的第i(1<=i<=length+1 )個位置插入新元素e,如果i的輸入不合法,則返回false,表示插入失敗;
否則,將順序表的第i個元素以及其后的所有元素向右移一個位置,騰出一個空位置插入新元素e,順序表長度增加1,插入成功,返回true算法思路:
1.判斷i的值是否正確
2.判斷表長是否超過數組長度
3.從后向前到第i個位置,分別將這些元素都向后移動一位返回類型 函數名 參數列表(&L 帶引用符號& 因為要對這個表進行修改)
*/bool InsertList(SqList &L,int i,ElemType e)
{if(i<1||i>L.length+1) //判斷i的范圍是否有效{printf("位置無效!\n");return false;}if(L.length>=MaxSize) //當前存儲空間已滿,不能插入{printf("當前存儲空間已滿!!!\n");return false;}//表中最后一個元素的下標是length-1,再后一位是length for(int j=L.length;j>=i;j--)L.data[j]=L.data[j-1];L.data[i-1]=e; //在位置i處放入eL.length++; //線性表長度加1return true;
}//刪除
/*
算法流程:
刪除順序表L中第i(1<=i<=L.length)個位置的元素,成功則返回true,否則返回false
算法思路:
1.判斷i的值是否正確
2.取刪除的元素
3.將被刪元素后面的所有元素都依次向前移動一位
4.修改表長
*/
bool ListDelete(SqList &L,int i)
{if(i<1||i>L.length){printf("位置無效!");return false;}for(int j=i;j<=L.length-1;j++){L.data[j-1]=L.data[j];}L.length--;return true;
}
//查找函數
int LocateElem(SqList &L,ElemType e)
{for(int i=0;i<L.length;i++) //從低位置查找{if(e==L.data[i]) return i+1; //下標為i的元素值等于e,返回其位序i+1}return 0; //退出循環,說明查找失敗
}//*******功能函數**********////輸出功能函數,按位置從小到大輸出順序表所有元素
void PrintList(SqList L)
{printf("當前順序表所有元素:");for(int i=0;i<L.length;i++){printf("%d ",L.data[i]); //依次輸出}printf("\n");
}//創建順序表函數
void Create(SqList &L)
{int n;bool flag;printf("請輸入要創建的順序表長度(>1):");scanf("%d",&n);printf("請輸入%d個數(空格隔開):",n);flag=CreatList(L,n);if(flag){printf("創建成功!\n");PrintList(L);}else printf("輸入長度非法!\n");
}//插入功能函數 調用InsertList完成順序表元素插入 調用PrintList函數顯示插入成功后的結果
void Insert(SqList &L)
{int place;ElemType e;bool flag;printf("請輸入要插入的位置(從1開始)及元素:\n");scanf("%d%d",&place,&e);flag=InsertList(L,place,e);if(flag){printf("插入成功!\n");PrintList(L);}
}//刪除功能函數 調用ListDelete函數完成順序表的刪除 調用PrintList函數顯示插入成功后的結果
void Delete(SqList &L)
{int place;bool flag;printf("請輸入要刪除的位置(從1開始):\n");scanf("%d",&place);flag=ListDelete(L,place);if(flag){printf("刪除成功!!!\n");PrintList(L);}
}//查找功能函數 調用LocateElem查找元素
void Search(SqList L)
{ElemType e;int flag;printf("請輸入要查找的值:");scanf("%d",&e);flag=LocateElem(L,e);if(flag){printf("該元素位置為:%d\n",flag);}else{printf("未找到該元素!\n");}
}//菜單
void menu()
{printf("********1.創建 2.插入*********\n");printf("********3.刪除 4.查找*********\n");printf("********5.輸出 6.退出*********\n");
}int main()
{SqList L;int choice;InitList(L); //初始化順序表while(1){menu();printf("請輸入菜單序號:\n");scanf("%d",&choice);if(6==choice) break; //退出switch(choice){case 1:Create(L); //創建break;case 2:Insert(L); //插入break;case 3:Delete(L); //刪除break;case 4:Search(L); //查找break;case 5:PrintList(L); //輸出break;default:printf("輸入錯誤!\n");}}return 0;
}
總結
以上是生活随笔為你收集整理的【数据结构】线性表的顺序存储结构(c语言实现)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。