順序表:內(nèi)存中的一塊連續(xù)區(qū)域,緊密排列了若干個(gè)相同類型的數(shù)據(jù)。
故,必須事先知道元素有多少個(gè),不然就無法開出合適的內(nèi)存區(qū)域。
對(duì)于線性表的"."and"->"
在c語言中,->是指針操作符,.是結(jié)構(gòu)操作符,如果L是一個(gè)結(jié)構(gòu)實(shí)例的指針,用->,如果是一個(gè)結(jié)構(gòu)的實(shí)例,用.
L為線性表時(shí),調(diào)用*L表示線性表的第一個(gè)元素,而調(diào)用&L表示線性表的首地址
類型名稱:線性表(List)
數(shù)據(jù)對(duì)象集:線性表是 n (≥0)個(gè)元素構(gòu)成的有序序列( a1, a2, ...,an ) 線性表基本操作主要有:
1、List MakeEmpty():初始化一個(gè)空線性表L;
2、ElementType FindKth( int K, List L ):根據(jù)位序K,返回相應(yīng)元素 ;
3、int Find( ElementType X, List L ):在線性表L中查找X的第一次出現(xiàn)位置;
4、void Insert( ElementType X, int i, List L):在位序i前插入一個(gè)新元素X;
5、void Delete( int? i, List L ):刪除指定位序i的元素;
6、int Length( List L ):返回線性表L的長(zhǎng)度n。
```
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
typedef struct LNode *List;
typedef int ElementType;
typedef 100 MAXSIZE;
struct LNode{
? ? ElementType Data[MAXSIZE];
? ? int Last;
};
struct LNode L; //L.Data[i]
List PtrL; //PtrL->Data[i]
/*
**函數(shù)名: List MakeEmpty();
**作? 用: 初始化一個(gè)空線性表L;
**形? 參: 無;
**返回值: PtrL;
*/
List MakeEmpty(void) //初始化空間
{
? ? List PtrL;
? ? PtrL=(List)malloc(sizeof(struct LNode));//void *表示未確定類型的指針。可強(qiáng)轉(zhuǎn)為任何其他類型的的指針。
? ? PtrL->Last=-1;
? ? return PtrL;
}
/*
**函數(shù)名: int Find(ElementType K,List PtrL);
**作? 用: 在線性表L中查找X的第一次出現(xiàn)位置
**形? 參: int K, List PtrL;
**返回值: 位置i;
*/
int Find(ElementType K,List PtrL) //查找
{
? ? int i=0
? ? while(i<=PtrL->Last && PtrL->Data[i]!=K);
? ? i++;
? ? if(i>PtrL->Last) return -1
? ? else return i;
}
/*
**函數(shù)名:ElementType FindKth( int K, List L );
**作? 用: 根據(jù)位序K,返回相應(yīng)元素;
**形? 參: int K,List PtrL;
**返回值: PtrL->Data[K]
*/
ElementType FindKth( int K, List PtrL)
{
? ? while(K<=PtrL->Last && K>=0);
? ? ? ? return PtrL->Data[K];
}
/*
**函數(shù)名: void Insert(ElementType K,int i,List PtrL);
**作? 用: 根據(jù)位置i來插入?yún)?shù)K;
**形? 參: ElementType K,int i,List Ptrl;
**返回值: PtrL;
*/
void Insert(ElementType K,int i,List Ptrl) ? //插入
{
? if(PtrL->Last==MAXSIZE-1){
? ? ? ? printf("線性表滿");
? ? ? ? return;
? ? }
? ? if(i<1||i>Ptrl->Last+2){
? ? ? ? printf("插入位置不合法");
? ? ? ? return;
? ? }
? ? for(j=PtrL->Last;j>i-1;j--){
? ? ? PtrL->Data[j+1]=PtrL->Data[j]
? ? }
? ? PtrL->Data[i+1]=K;
? ? PtrL->Last++;
}
/*
**函數(shù)名: void Delete( int? i, List PtrL )
**作? 用: 刪除指定位序i的元素;
**形? 參: int? i, List PtrL
**返回值:
*/
void Delete( int? i, List PtrL)
{
? ? int j;
? ? if(i>1 || i<=PtrL->Last+1){
? ? ? ? for(j=i;j<=PtrL->Last;j++){
? ? ? ? ? ? PtrL->Data[j-1]=PtrL->Data[j];
? ? ? ? }
? ? ? ? PtrL->Last--;
? ? }else{
? ? ? ? return;
? ? }
}
/*
**函數(shù)名: int Length( List L );
**作? 用: 返回線性表L的長(zhǎng)度n;
**形? 參: List PtrL
**返回值:
*/
int Length(List PtrL){
? ? //return sizeof(PtrL)/ElementType;
? ? return PtrL->Last+1;
}
```
<pre>
ss
</pre>
第二種是我剛寫的
不多說,直接上code
```
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define listincreament 10 //存儲(chǔ)空間分配增量
typedef struct{
int *elem; //存儲(chǔ)空間基址 (末尾)
int length;//當(dāng)前長(zhǎng)度
int listsize;// 當(dāng)前分配的存儲(chǔ)容量
} SqList;
//構(gòu)造一個(gè)空的線性表(初始化)
int InitList_Sq(SqList *L)
{
//動(dòng)態(tài)分配空間
L->elem=(int *)malloc(80*sizeof(int));
//存儲(chǔ)分配失敗
if(!L->elem)
exit(OVERFLOW);
//存儲(chǔ)分配成功
//初始化長(zhǎng)度為零
L->length=0;
//存儲(chǔ)的初始容量為初始分配空間
L->listsize=80;
return OK;
}
//n為要插入的位置
int Input_Sq(SqList *L,int n)
{
int i ,*newbase;
if(n<0)
return ERROR;
if(n>L->listsize)
{
newbase=(int *)malloc(listincreament*sizeof(int));
if(!newbase){
exit(OVERFLOW);
}
L->elem=newbase;
L->length+=listincreament;
}
printf("請(qǐng)輸入元素:\n");
for(i=0;i<n;i++)
{
scanf("%d",&L->elem[i]);
L->length++;
}
return OK;
}
//i為位置,并非下標(biāo),e為要插入的新元素
int ListInsert_Sq(SqList *L,int i,int e){
//i需要滿足1<=i<=ListLength_Sq(L)+1
int *newbase;
int *p;
int *q;//插入的位置
int j;
//判斷輸入
if(i<1||i>L->length+1)
return ERROR;
//判斷線性表是否已滿
if(L->length>=L->listsize)//滿,(魯棒性)(擴(kuò)展)是否動(dòng)態(tài)增加空間?
{
/*newbase=(int *)realloc((L->listsize+listincreament)*sizeof(int));
if(!newbase)
exit(OVERFLOW);//分配失敗
*/
for(j=0;j<L->length;j++)
{
newbase[j]=L->elem[j];
}
L->elem=newbase;//新基址
L->length+=listincreament;//增加存儲(chǔ)容量
}
q=&(L->elem[i-1]);
for(p=&(L->elem[L->length+1]);p>=q;p--)//元素后移
*(p+1)=*p;
*q=e; //插入
L->length+=1;//表長(zhǎng)加1
return L->length;//返回表長(zhǎng)
}
int Output_Sq(SqList *L,int i)
{
int j;
printf("更新后的線性表為:\n");
for(j=0;j<i;j++)
printf("%d\t",L->elem[j]);
return OK;
}
//在順序線性表刪除第i個(gè)元素,用e返回其值
int Delete_Sq(SqList *L,int i,int e)
{
int *q;
//先檢查i的合法性
if(i<1||i>L->length)
return ERROR;
e=L->elem[i-1];//被刪除的元素賦給e,之后用作返回
int *p=&L->elem[i-1]; //指針p為被刪除元素的位置
for(q=p+1;q<=p+(L->length);q++)
*(q-1)=*q;
L->length-=1;
return OK;
}
int main(void)
{
SqList MyL;
char a,yn;
a='Y';
int k,data,position,*e;
InitList_Sq(&MyL);
printf("請(qǐng)輸入元素個(gè)數(shù):");
scanf("%d",&k);
Input_Sq(&MyL,k);
Output_Sq(&MyL,k);
while(a=='Y')
{
printf("\n請(qǐng)輸入要插入的元素:");
scanf("%d",&data);
printf("\n請(qǐng)輸入要插入的位置:");
scanf("%d",&position);
ListInsert_Sq(&MyL,position,data);
//printf(&MyL.length);
Output_Sq(&MyL,k+1);
printf("\n請(qǐng)輸入要?jiǎng)h除的元素的位置:");
scanf("%d",&position);
Delete_Sq(&MyL,position,e);
Output_Sq(&MyL,k);
printf("\n請(qǐng)問是否繼續(xù)(Y or N)?:");
getchar();
scanf("%c",&a);
}
system("pause");
return OK;
}
```
效果如下
?