順序表:
定義:就是按照順序存儲方式存儲的線性表,各 節點按照邏輯次序依次存放在計算機的一組連續的存儲單元中。 只要知道了首地址以及每個數據元素所佔的存儲長度,就可以計算出任何一個數據元素(數據節點)的位置;
節點類型相同的情況下:基地址LOC(a1);每個節點佔C個存儲單元;
LOC(ai)=LOC(a1)+(i-1)*c a≤i≤n;
基本操作:
準備數據:順序表的結構;
初始化:置0;
計算表長度:節點個數;
插入節點:從頭開始依次插入;後面點節點依次後移一位;
追加節點: 在末尾加節點;
刪除節點:後面的節點依次前移一位;
查找節點(按序號、關鍵字)
顯示所有節點。
#define MAXLEN 100 //定義順序表最大長度
typedef struct
{
char key[10]; //節點關鍵字
char name[20];
int age;
}DATA; //定義節點類型
typedef struct //定義順序表結構
{
DATA ListData[MAXLEN+1]; //保存順序表的結構數組
int ListLen; //順序表已存節點的數量
}SLType;
//初始化順序表
void SLInit(SLType * SL){
SL->ListLen=0; //初始化爲空
}
int SLLength(SLType * SL)
{
return(SL->ListLen);
}
int SLInsert(SLType * SL,int n,DATA data)
{
int i;
if (SL->ListLen>=MAXLEN)
{
printf("順序表已滿,不能插入");
return 0;
}
if (n<1||n>SL->ListLen-1)
{
printf("插入序號錯誤,不能插入元素");
return 0;
}
for (i=SL->ListLen;i>=n;i--)
{
SL->ListData[i+1]=SL->ListData[i];
}
SL->ListData[n]=data;
SL->ListLen++;
return 1;
}
int SLAdd(SLType * SL,DATA data)
{
if (SL->ListLen>=MAXLEN)
{
printf("順序表已滿,不能再添加節點了");
return 0;
}
SL->ListData[++SL->ListLen]=data;
return 1;
}
int SLDelete(SLType * SL,int n)
{
int i;
if (i>SL->ListLen+1||i<1)
{
printf("刪除節點錯誤,不能刪除節點");
return 0;
}
for (i=n;i<SL->ListLen;i++)
{
SL->ListData[i]=SL->ListData[i+1];
}
SL->ListLen--;
return 1;
}
DATA * SLFindByNum(SLType * SL,int n)
{
if (n<1||n>SL->ListLen+1)
{
printf("節點序號錯誤,不能反回結果");
return NULL;
}
else
return &(SL->ListData[n]);
}
int SLFindByCont(SLType * SL,char * key)
{
int i;
for (i=1;i<=SL->ListLen;i++)
{
if (strcmp(SL->ListData[i].key,key)==0)
{
return i;
}
}
return 0;
}
int SLAll(SLType * SL)
{
int i;
for (i=1;i<=SL->ListLen;i++)
{
printf("(%s %s %d)\n",SL->ListData[i].key,SL->ListData[i].name,SL->ListData[i].age);
}
return 0;
}
//另外,還學了一個清空操作 ---> fflush(stdin); //清空輸入緩衝區