資料結構C語言—線性表【順序儲存】順序表(定義結構體變數實現)
阿新 • • 發佈:2021-11-23
目錄
SqList.h
#define ListSize 100 #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define INFEASIBLE 1 #define OVERFLOW 1 typedef int Status; typedef int DataType; typedef int *Pt; typedef struct { DataType data[ListSize]; DataType length; }SqList,*PSqList;//通過靜態定義變數形式構造空的線性表L void InitList(PSqList L);//初始化一個空的線性表L //Status DestoryList(int* L);//銷燬線性表L void ClearList(PSqList L);//清空線性表L Status IsEmptyList(PSqList L);//若L為空表,則返回TRUE,否則返回FALSE DataType ListLength(PSqList L);//返回L中資料元素個數 DataType GetElem(PSqList L,DataType i,Pt e);//用e返回L中第i個元素的值,操作成功返回OK,否則返回ERROR DataType LocateElem(PSqList L,DataType e);//返回e在L中的位置,有該資料元素則返回其位置,否則返回0 Status PriorElem(PSqList L,DataType e,Pt proe);//若若e是L的資料元素,且不是第一個,則用proe返回它的前驅。操作成功返回OK,否則返回-6699 Status NextElem(PSqList L,DataType e,Pt nexte);//若e是L的資料元素,且不是最後一個,則用nexte返回它的後繼。操作成功返回OK,否則返回-6699 Status ListInsert(PSqList L,DataType i,DataType e);//在L第i個位置之前插入新的元素e,L長度加1,成功操作返回OK,否則返回ERROR DataType ListDelete(PSqList L,DataType i,Pt e);//刪除L的第i個數據元素,並用e返回其值,L長度減1,操作成功返回刪除的值,否則返回ERROR Status ListTraverse(PSqList L);//依次對L每個資料元素呼叫函式,成功遍歷返回OK,否則返回ERROR
SqList.c
# include "SqList.h" # include <stdio.h> void InitList(PSqList L)//構造一個空的線性表L { L->length=0; } void ClearList(PSqList L)//清空線性表L { L->length=0; printf("\n已執行清空線性表L!\n"); } Status IsEmptyList(PSqList L)//若L為空表,則返回TRUE,否則返回FALSE { if(L->length==0) { return TRUE; } else { return FALSE; } } DataType ListLength(PSqList L)//返回L中資料元素個數 { return L->length; } DataType GetElem(PSqList L,DataType i,Pt e)//用e返回L中第i個元素的值,操作成功返回其值,否則返回-6699 { if(L->length==0||i>L->length) { return -6699; } else { return *e=L->data[i-1]; } } DataType LocateElem(PSqList L,DataType e)//返回e在L中的位置,有該資料元素則返回其位置,否則返回0 { DataType i; for(i=0;i<L->length;i++) { if(L->data[i]==e) { return i+1; } } return 0; } Status PriorElem(PSqList L,DataType e,Pt proe)//若e是L的資料元素,且不是第一個,則用proe返回它的前驅。操作成功返回OK,否則返回-6699 { DataType i; i=LocateElem(L,e); if(i>=2) { *proe=L->data[i-1-1]; return OK; } else { if(i==0) { *proe=-6699; printf("\n該元素:%d不在L中!無法找其前驅!\n",e); return -6699; } else { if(i==1) { *proe=-6699; printf("\n該元素是第一個元素,無前驅!\n"); return -6699; } } } return -6699; } Status NextElem(PSqList L,DataType e,Pt nexte)//若e是L的資料元素,且不是最後一個,則用nexte返回它的後繼。操作成功返回OK,否則返回-6699 { DataType i; i=LocateElem(L,e); if(i>=1&&i<=L->length-1) { *nexte=L->data[i-1+1]; return OK; } else { if(i==0) { *nexte=-6699; printf("\n該元素:%d不在L中!無法找其後繼!\n",e); return -6699; } else { if(i==L->length) { *nexte=-6699; printf("\n該元素是最後一個元素,無後繼!\n"); return -6699; } } } return -66999; } Status ListInsert(PSqList L,DataType i,DataType e)//在L第i個位置之前插入新的元素e,L長度加1,成功操作返回OK,否則返回ERROR { if(i<1||i>L->length+1) { printf("\n插入位置:%d不合法!\n",i); return ERROR; } else { if(ListLength(L)>=ListSize) { printf("\n該L表已滿!\n"); return ERROR; } else { DataType k; for(k=L->length-1;k>=i-1;k--) { L->data[k+1]=L->data[k]; } L->data[i-1]=e; L->length++; return OK; } } } DataType ListDelete(PSqList L,DataType i,Pt e)//刪除L的第i個數據元素,並用e返回其值,L長度減1,操作成功返回刪除的值,否則返回ERROR { if(ListLength(L)==0) { printf("\n表為空,不能執行刪除元素!\n"); return ERROR; } else { if(i>ListLength(L)) { printf("刪除位置超過表長,非法刪除!\n\n"); return ERROR; } else { *e=L->data[i-1]; DataType k; for(k=i;k<L->length;k++) { L->data[k-1]=L->data[k]; } L->length--; return *e; } } } Status ListTraverse(PSqList L)//依次對L每個資料元素呼叫函式,成功遍歷返回OK,否則返回ERROR { DataType k; if(IsEmptyList(L)==1) { printf("\n遍歷失敗!表L為空!\n"); return ERROR; } else { for(k=0;k<L->length;k++) { if(k==0) { printf("開始遍歷L:%d",L->data[k]); } else { printf(" %d",L->data[k]); } } printf("\n"); return OK; } }
main.c
#include <stdio.h> #include <stdlib.h> #include "SqList.h" #include <windows.h> /* 線性表——順序表【自編程式碼】 */ int main() { DataType ef=-66999,n0,m,v,co=1; SqList L; printf("<————線性表的順序儲存【靜態法】————>\n\n\n"); printf("——————初始化線性表靜態法——————\n"); InitList(&L);//構造一個空的線性表L //Status DestoryList(int* L);//銷燬線性表L for(m=0;m<=100;m=m+10) { printf("\r"); for(v=0;v<=co;v++) { printf("---"); Sleep(10); } co++; printf(">%d%%\r",m); printf("\r"); Sleep(80); } printf("\n——————初始化線性表已完成——————\n"); printf("\n——————初始化依次插入元素——————\n"); DataType i; printf("請輸入要插入的整型元素(以f結束):"); for(i=0;i<ListSize;i++) { DataType n,k; k=scanf("%d",&n); if(k==0) { break; } else { ListInsert(&L,i+1,n); } } printf("——————初始化依次插入完成——————\n"); printf("\n——————開始遍歷檢查初始化——————\n"); ListTraverse(&L); printf("——————遍歷檢查初始化完成——————\n"); printf("\n——————開始檢查表中元素數——————"); printf("\n當前表L中元素個數為:%d\n",ListLength(&L));//返回L中資料元素個數 printf("——————檢查表中元素數完成——————\n"); getchar(); printf("\n輸入要查詢的位置:"); scanf("%d",&i); GetElem(&L,i,&ef);//用e返回L中第i個元素的值,操作成功返回OK,否則返回ERROR printf("\n當前表L中第%d個元素為:%d\n",i,ef); printf("\n輸入要返回其前驅的元素值:"); scanf("%d",&i); printf("\n%d在表L中位置是:%d\n",i,LocateElem(&L,i));//返回e在L中的位置,有該資料元素則返回其位置,否則返回0 PriorElem(&L,i,&ef);//若若e是L的資料元素,且不是第一個,則用proe返回它的前驅。操作成功返回OK,否則返回-6699 printf("\n%d在表L中前驅是:%d\n",i,ef); printf("\n輸入要返回其後繼的元素值:"); scanf("%d",&i); printf("\n%d在表L中位置是:%d\n",i,LocateElem(&L,i));//返回e在L中的位置,有該資料元素則返回其位置,否則返回0 NextElem(&L,i,&ef);//若e是L的資料元素,且不是最後一個,則用nexte返回它的後繼。操作成功返回OK,否則返回-6699 if(ef!=-6699) { printf("\n%d在表L中後繼是:%d\n",i,ef); } printf("\n輸入要插入的位置和插入值:"); scanf("%d %d",&i,&n0); if(ListInsert(&L,i,n0)==1)//在L第i個位置之前插入新的元素e,L長度加1,成功操作返回OK,否則返回ERROR { printf("已成功插入!\n"); } else { printf("插入失敗!可能是位置違規或表已滿!\n"); } printf("\n——————開始遍歷檢查表資料——————\n"); ListTraverse(&L); printf("——————遍歷檢查初始化完成——————\n"); printf("\n當前表L中元素個數為:%d\n",ListLength(&L));//返回L中資料元素個數 printf("輸入要刪除的位置:"); scanf("%d",&i); if(ListDelete(&L,i,&ef))//刪除L的第i個數據元素,並用e返回其值,L長度減1,操作成功返回刪除的值,否則返回ERROR { printf("已刪除第%d個位置元素!\n",i); } ListTraverse(&L); printf("\n當前表L中元素個數為:%d\n",ListLength(&L));//返回L中資料元素個數 ClearList(&L);//清空線性表L ListTraverse(&L); printf("\n當前表L中元素個數為:%d\n",ListLength(&L));//返回L中資料元素個數 system("pause"); return 0; }
執行結果示例
------------------------------------------------------第一次發文章有點激動啊!-----------------------------------------------------
-----------------------------------------------------【資料結構程式碼自編練習】------------------------------------------------------
----------------------------------------------------------------【TDTX】-----------------------------------------------------------------