線性表是一種最簡單的線性結構,它是由同類數據元素組成的有序序列的集合。表中的元素個數稱爲表長,表中沒有元素時稱爲空表,表的起始位置稱爲表頭,表的結束位置稱爲表尾。線性表一般有兩種方法存儲,順序存儲和鏈式存儲。
1、線性表的順序存儲實現
(1)數據結構的定義
typedef struct list{
int Data[MAXSIZE];
int last;
}List;
裏面包含一個存儲數據的數組和一個指向數組最後一個元素的下標。
(2)線性表一般包含以下幾個基本的操作函數接口
List* MakeEmpty(); --創建一個空表
int Find(int elem,List *list); --按值尋找elem的節點,並返回該節點下標
int FindKth(int k,List *list); --按序號查找第K(下標)個節點,並返回該節點的數據
void Delete(int i,List *list); --刪除下標爲i個元素
void Insert(int elem,int i,List *list); --在下標爲的i的前面插入一個新元素
int Lenth(List *list); --計算表的長度
(3)具體實現方法
List* MakeEmpty()
{
List *list;
list=(List*)malloc(sizeof(List));
list->last=-1;
return list;
}
int Find(int elem,List *list)
{
int i=list->last;
while(list!=NULL&&i!=-1)
{
if(list->Data[i]==elem)
return i;
i--;
}
return -1;
}
int FindKth(int k,List *list)
{
return list->Data[k];
}
void Insert(int elem,int i,List *list)
{
if(Lenth(list)<MAXSIZE)
{
int j;
for(j=list->last+1;j>i;j--)
{
list->Data[j]=list->Data[j-1];
}
list->Data[i]=elem;
list->last=list->last+1;
}
else
{
printf("\nthere is no enough space to insert");
}
}
void Delete(int i,List *list)
{
if(i>1&&i<=list->last+1)
{
int j;
for(j=i;j<list->last;j++)
list->Data[j]=list->Data[j+1];
list->last=list->last-1;
}
else
{
printf("no elem at %d\n",i);
}
}
int Lenth(List *list)
{
return list->last+1;
}
//測試代碼
int main()
{
List *list=MakeEmpty();
int i;
for(i=0;i<10;i++)
{
list->Data[i]=i;
list->last++;
}
int a;
printf("input a num\n");
scanf("%d",&a);
int ret=Find(a,list);
if(ret>=0)
{
printf("%d has found,which is at %d\n",a,ret);
printf("the %dth is %d\n",a,FindKth(ret,list));
}
else
{
printf("%d isn't exsit\n",a);
}
printf("lenth=%d\n",Lenth(list));
printf("before insert:");
int j;
for(j=0;j<list->last+1;j++)
printf("%d ",list->Data[j]);
Insert(520,5,list);
printf("\nafter insert:");
int k;
for(k=0;k<list->last+1;k++)
printf("%d ",list->Data[k]);
printf("\nlenth=%d\n",Lenth(list));
Delete(5,list);
printf("after delete:");
for(k=0;k<list->last+1;k++)
printf("%d ",list->Data[k]);
printf("\nlenth=%d\n",Lenth(list));
return 0;
}
2、線性表的鏈式存儲實現
(1)數據結構
typedef struct Node{
int data;
struct Node* next;
}List;
(2)基本操作函數接口
List* Find(int elem,List *list); --按值尋找elem的節點,並返回指向該節點的指針
List* FindKth(int k,List *list); --按序號查找第K(下標)個節點,並返回指向該節點的指針
List* Delete(int i,List *list); --刪除第i個元素,返回刪除之後的鏈表頭指針
List* Insert(int elem,int i,List *list); --在i-1前面插入一個新元素,返回插入之後的鏈表頭指針
int Lenth(List *list); --計算表的長度
(3)具體實現
List* Find(int elem,List *list)
{
List *p=list;
while(p)
{
if(p->data==elem)
return p;
p=p->next;
}
return NULL;
}
List* FindKth(int k,List *list)
{
int i;
List *p=list;
int len=Lenth(list);
for(i=0;i<len;i++)
{
if(i==k)
return p;
p=p->next;
}
return NULL;
}
List* Insert(int elem,int i,List *list)
{
int k=0;
List *p=list;
List *q;
if(i==0)//表示在表頭插入新節點
{
q=(List*)malloc(sizeof(List));
q->data=elem;
q->next=list;
return q;
}
p=FindKth(i-1,list);
if(p!=NULL)
{
//指針P已經移到i-1的位置
q=(List*)malloc(sizeof(List));
q->data=elem;
q->next=p->next;
p->next=q;
return list;
}
else
{
printf("\n參數輸入有誤,無法完成插入\n");
return NULL;
}
}
List* Delete(int i,List *list)
{
List *p=list;
List *q;
if(i==0)
{
list=p->next;
free(p);
return list;
}
p=FindKth(i-1,list);
if(p==NULL)
{
printf("\n沒有第%d個節點\n",i-1);
return list;
}
else if(p->next==NULL)
{
printf("\n沒有第%d個節點\n",i);
return list;
}
else
{
q=p->next;
p->next=q->next;
free(q);
return list;
}
}
int Lenth(List *list)
{
int i=0;
List *p=list;
while(p)
{
p=p->next;
i++;
}
return i;
}
int main()
{
List *list;
int i;
list=Insert(0,0,NULL);
for(i=1;i<11;i++)
list=Insert(i,0,list);
printf("elem in list is:\n");
printf("lenth of list is %d\n",Lenth(list));
int len;
List *p=list;
len=Lenth(list);
for(i=0;i<len;i++)
{
printf("%d ",p->data);
p=p->next;
}
p=Insert(1120,4,list);
if(p!=NULL)
{
len=Lenth(p);
printf("\n");
for(i=0;i<len;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\nthe lenth of list is %d",len);
}
p=Delete(12,list);
if(p!=NULL)
{
len=Lenth(p);
printf("\n");
for(i=0;i<len;i++)
{
printf("%d ",p->data);
p=p->next;
}
printf("\nthe lenth of list is %d",len);
}
p=Find(11,list);
if(p)
printf("\nfind success\n");
else
printf("\nthe elem you find is not exsit\n");
return 0;
}