全面瞭解資料結構之順序表
阿新 • • 發佈:2018-12-12
此為順序表的一個C語言實現過程,其中對每一行程式碼進行了標註,同時為了方便理解順序表的儲存,邏輯與物理是相同的。也將儲存地址一同顯示出來了。
#include<stdio.h>
#include<stdlib.h>
#define MAX 1024
typedef struct
{
int data[MAX];//data是個陣列,定義了最大長度的陣列
int last;//就是個位置,沒有特殊含義
}linearlist;
//定義指標是傳入地址,直接對數進行操作
void Listlist(linearlist* list)
{
int i;
printf("當前線性表的狀態:\n" );
if(list->last==0)//宣告物件list,物件內賦值位置成員last
printf("當前順序表為空");
else
for(i=0;i<(list->last);i++)
printf("註釋正在遍歷陣列,輸出所有值\n");
printf("[%4d]",list->data[i]);//小於值,則遍歷輸出陣列
printf("\n");
}
void Output(linearlist* list)
{
system("cls");
printf("----------------順序表--------------\n" );
printf("- a:追加一個節點 i:插入一個節點 -\n");
printf("- d:刪除一個節點 e:退出 -\n");
printf("--------------升級版----------------\n");
printf("此時順序表(陣列)的長度:%d\n",list->last);//list的last是從0開始的
int i;
for(i=0;i<list->last;i++)//35
printf("資料是%d,儲存地址是%d\n",list->data[i],&list->data[i] );//34
Listlist(list);
}
linearlist* CreateList()
{
linearlist* list=(linearlist*)malloc(sizeof(linearlist));//分配地址空間,相當於java、c++的new方法
list->last=0;//對第一個賦值為零,此時陣列內為0
return list;
}
void AppendNode(linearlist* list,int n)//追加結點
{
if(list->last<MAX)//如果此時最後一個數的位置小於預定義的陣列的長度,則執行
{
list->data[list->last]=n;//直接定位到陣列的相應元素
list->last+=1;//陣列或順序表的長度
}
}
void InsertNode(linearlist* list,int n,int pos){//插入結點
int j;
if(pos<0||pos>(list->last))//53
printf("超出順序表的範圍!");
else
{
for(j=list->last;j>=pos;j--)
list->data[j+1]=list->data[j];//插入結點後每個元素向後移動一個單位
list->data[pos]=n;//對插入的單位進行賦值
list->last++;//最大值增加一個
}
}
void DeleteNode(linearlist* list,int pos)//刪除結點
{
int j;
if(pos<0||(pos>list->last))//超出陣列範圍
printf("刪除的節點位置超出順序標的範圍!");
else
{
for(j=pos;j<list->last;j++)
list->data[j]=list->data[j+1];//每個資料都向前移動一個位置
list->last--;
}
}
void pritln(linearlist* list)
{
int i;
for(i=0;i<list->last;i++)//35
printf("資料是%d,儲存地址是%d\n",list->data[i],&list->data[i]);//34
}
int main()
{
int key,pos;
char ch;
linearlist* list;
list=CreateList();
while(1)//此處是一個無限迴圈
{
Output(list);//每次新增完資料後都執行此語句,清空介面
printf("請選擇");
ch=getchar();
fflush(stdin);
if(ch=='a')
{
printf("請輸入要追加的資料");
scanf("%d",&key);
AppendNode(list,key);
}
else if(ch=='i')
{
printf("請輸入要插入的位置");
scanf("%d",&pos);//100
printf("請輸入要插入的資料");
scanf("%d",&key);
InsertNode(list,key,pos);
}
else if(ch=='d')
{
printf("請輸入要刪除的位置");
scanf("%d",&pos);
DeleteNode(list,pos);
}
else if(ch=='e')
exit(0);
Output(list);
fflush(stdin);//清空輸入輸出
}
pritln(list);
return 0;
}
本文是根據課本《C語言從入門到精通》中的順序表整理出來的。如有侵權,請直接聯絡我。本部落格將會很快刪除