1、線性表的數(shù)據(jù)操作
創(chuàng)新互聯(lián)服務(wù)項目包括西崗網(wǎng)站建設(shè)、西崗網(wǎng)站制作、西崗網(wǎng)頁制作以及西崗網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,西崗網(wǎng)站推廣取得了明顯的社會效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到西崗省份的部分城市,未來相信會繼續(xù)擴大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!2、使用定義的函數(shù)實現(xiàn)兩個集合LA和LB的合并:
void unionList(List LA,List LB,List &LC)
{
int lena,i;
ElemType e;
InitList(LC);
//將LA的所有元素插入到LC中
for (i=1;i<=ListLength(LA);i++)
{
GetElem(LA,i,e);
ListInsert(LC,i,e);
}
lena=ListLength(LA);
//將LB的所有元素插入到LC
for(i=1;i
3、順序表存儲類型的定義
# define MaxSize 50
typedef struct
{
ElemType date[MaxSize];
int length;
}SqList;
4、創(chuàng)建線性表
void CreateList(Sqlist *&L,ElemType a[],int n)
{
int i;
L=(SqList *)malloc(sizeof(SqList));
// malloc 相當(dāng)于new,分配SqList大小的內(nèi)存空間,指向SqLost的指針,并將地址賦值給L
for (i=0;idata[i]=a[i];
L->length=n;
}
5、初始化線性表
void InitList(SqList *&L) // 應(yīng)用指針
{
L=(SqList *)malloc(sizeof(SqList));
L->length=0; // 初始化線性表的長度
}
6、銷毀線性表
void DestroyList(SqlList *&L)
{
free(L);
}
7、判斷線性表是否為空
bool ListEmpty(SqList *L)
{
return(L->length==0);
}
8、求線性表的長度
int ListLength(SqList *L)
{
return(L->length);
}
9、輸出線性表
void DispList(SqList *L)
{
int i;
if (ListEmpty(L))
return;
for (i=0;ilength;i++)
printf("%d ",L->data[i]);
printf("\n");
}
10、求某個數(shù)據(jù)元素的值,返回L中的第i個元素的值,并存入e中,1<=i<=ListLength(L)
bool GetElem(SqList *L,int i,ElemType &e)
{
if (i<1||i>L->length)
return false;
e=L->data[i-1];
return true;
}
11、按元素值查找
int LocateElem(L,e)
{
int i = 0;
while (ilength && L->data[i]!=e)
i++;
if (i>=L->length)
return 0;
else
return i+1;
}
12、插入元素
bool ListInsert(SqList *&L,int i,ElemType e)
{
int j;
if (i<1||i>L->length+1)
return false;
i--;
for (j=L->length;j>i;j--)
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;
return true;
}
13、刪除元素
bool ListDelete(SqList *&L,int i,ElemType &e)
{
int j;
if (i<1||i>L->length)
return false;
i--;
e=L->data[i];
for(j=i;jlength-1;j++)
L->data[j]=L->data[j+1];
L->length--;
return true;
}
1、單鏈表的存儲結(jié)構(gòu)的定義
typedef struct LNode // 定義單鏈表節(jié)點類型
{
ElemType data; //數(shù)據(jù)域
struct LNode *next; //指針域,指向后繼節(jié)點 遞歸結(jié)構(gòu)
}LinkList;
2、單鏈表的頭插法:
void CreateListF(LinkList *&L,ElemType a[],int n)
{
LinkList *S;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
for(i=0;idata=a[i];
S->next=L->next;
L->next=S;
}
}
3、單鏈表尾插法
void CreateListR(LinkList *&L,ElemType a[],int n)
{
LinkList *s,*r;
int i;
L=(LinkList *)malloc(sizeof(LinkList));
r=L;
for(i=0;idata=a[i];
r->next=s;
r=s;
}
r->next=NULL;
}
4、單鏈表的基本操作
5、初始化線性表
void InitList(LinkList *&L)
{
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
6、銷毀線性表
void DestroyList(LinkList *&L)
{
LinkList *pre=L,*p=L->next;
while (p=NULL)
{
free(pre);
pre=p;
p=pre->next;
}
free(pre);
}
7、判斷表為空
bool ListEmpty(LinkList *L)
{
return(L->next==NULL);
}
8、求線性表的ListLength(L)
int ListLength(LinkList *L)
{
int n=0;
LinkList *p=L;
while (p->next!=NULL)
{
n++;
p=p->next;
}
return(n);
}
9、輸出線性表:
void DisList(LinkList *L)
{
LinkList *p=L->next;
while(p!=NULL)
{
printf("%d",p->data);
p=p->next;
}
printf("\n")
}
10、查找某個元素
bool GetElem(LinkList *L,int i,ElemType &e)
{
int j=0;
LinkList *p=L;
while (jnext;
}
if (p==NULL)
return false;
else
{
e=p->data;
return true;
}
}
11、 按元素查找,返回元素的位置
int LocateElem(LinkList *L,ElemType e)
{
int i=1;
LinkList *p=L->next;
while (p!=NULL&& p->data!=e)
{
p=p->next;
i++;
}
if (p==NULL)
return 0;
else
return i;
}
12、插入數(shù)據(jù)元素:
bool ListInsert(LinkList *&L,int i,ElemType e){
int j=0;
LinkList *p=L,*S;
while (jnext;
}
if (p==NULL)
return false;
else{
S=LinkList *)malloc(sizeof(LinkList));
S->data=e;
S->next=p->next;
p->next=S;
return true;
}
}
13、刪除數(shù)據(jù)元素
bool ListDelete(LinkList *&L,int i,ElemType &e)
{
int j=0;
LinkList *p=L,*q;
while(jnext;
}
if (p==NULL)
return false;
else{
q=p->next;
if(q=NULL)
return false;
e=q->data;
p->next=q->next;
free(q);
return true;
}
}
1、雙向鏈表的定義和存儲結(jié)構(gòu)
typedef struct DNode
{
ElemType data;
struct DNode *prior;
struct DNode *next;
}DLinkList;
2、頭插法建立雙鏈表
{
DLinkList *S;
int i;
L=(DLinkList *)malloc(sizeof(DLinkList));
L->prior=L->next=NULL;
for(i=0;idata=a[i];
S->next=L->next;
if(L->next!=NULL)
L->next->prior=S;
L->next=S;
S->prior=L;
}
}
3、尾插法建立雙鏈表
void CreateListR(DLinkList *&L,ElemType a[],int n)
{
DLinkList *s,*r;
int i;
L=(DLinkList *)malloc(sizeof(DLinkList));
r=L;
for (i=0;idata=a[i];
r->next=s;
s->prior=r;
r=s;
}
r->next=NULL;
}
4、插入節(jié)點:
bool ListInsert(DLinkList *&L,int i,ElemType e)
{
int j=0;
DLinkList *p=L,*s;
while(jnext;
}
if (p=NULL)
return false;
else
{
s=(DLink *)malloc(sizeof(DLinkList));
s->data=e;
s->next=p->next;
if (p->next!=NULL)
P->next->prior=s;
s->prior=p;
p->next=s;
return true;
}
}
5、雙鏈表刪除節(jié)點
bool ListDelete(DLinkList *&L,int i,ElemType &e)
{
int j=0;
DLinkList *p=L, *q;
while (jnext;
}
if (p==NULL)
return false;
else
{
q=p->next;
if (q==NULL)
return false;
e=q->data;
p->next=q->next;
if (p->next!=NULL)
p->next->prior=p;
free(q);
return true;
}
}
1、有序順序表的插入操作:
void ListInsert(SqList *&L,ElemType e)
{
int i =0,j;
while (ilength && L->data[i]i;j--)
L->data[j]=L->data[j-1];
L->data[i]=e;
L->length++;
}
2、有序鏈表的插入操作:
void ListInsert(LinkList *&L,ElemType e)
{
LinkList *pre=L, *p;
while (pre->next!=NULL && pre->next->data < e)
pre=pre->next;
p=(LinkList *)malloc(sizeof(LinkList));
p->data=e;
p->next=pre->next;
pre->next=p;
}
3、采用順序表存放有序表時的歸并算法(將順序表LA和LB中的元素插入到LC中形成一個新的順序表):
void UnionList(SqList *LA,SqList *LB,SqList *&LC)
{
int i=0,j=0,k=0;
LC=(SqList *)malloc(sizeof(SqList));
// LA和LB均未達(dá)到末尾時,擇其小加入LC
while(ilength && jlength)
{
if(LA->data[i]data[j])
{
LC->data[k]=LA->data[i];
i++;
}
else
{
LC->data[k]=LB->data[j];
j++;
}
k++;
}
// LA 尚未掃描完,將其余元素插入LC中
while(ilength)
{
LC->data[k]=LA->data[i];
i++;
k++;
}
while(jlength)
{
LC->data[k]=LB->data[j];
j++;
k++;
}
}
4、采用單鏈表存放有序表時的歸并算法(將有序鏈表LA和LB中的元素插入到LC中形成一個新的有序鏈表):
void UnionList1(LinkList *LA,LinkList *LB,LinkList *&LC)
{
LinkList *pa=LA->next, *pb=LB->next, *r,*s;
LC=(LinkList *)malloc(sizeof(LinkList));
r=LC;
// LA 和 LB 均未達(dá)到末尾時,擇其小優(yōu)先尾插
while(pa!=NULL && pb!=NULL)
{
S=(LinkList *)malloc(sizeof(LinkList));
if(pa->datadata)
{
s->data=pa->data;
pa=pa->next;
}
else
{
s->data=pb->data;
pb=pb->next;
}
r->next=s;
r=s;
}
// LA 未達(dá)到末尾,復(fù)制LA中所有結(jié)點
while(pa!=NULL)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pa->data;
r->next=s;
r=s;
pa=pa->next;
}
// LB 未達(dá)到末尾,復(fù)制LA中所有結(jié)點
while(pb!=NULL)
{
s=(LinkList *)malloc(sizeof(LinkList));
s->data=pb->data;
r->next=s;
r=s;
pb=pb->next;
}
}
1、棧的判定:
2、初始化一個空棧s,實際上是將棧頂指針指向-1即可。
// 定義一個順序棧
typedef struct
{
ElemType data[MaxSize];
int top;
}SqStack;
void InitStack(SqStack *&s)
{
s=(SqStack *)malloc(sizeof(SqStack)); // 申請內(nèi)存空間
s->top=-1;
}
3、釋放棧s占用的空間,銷毀棧:
void DestoryStack(SqStack *&s)
{
free(s);
}
4、進(jìn)棧操作push(&s,e)
bool Push(SqStack *&s,ElemType e)
{
if (s->top==MaxSize-1)
return false; // 棧滿
s->top++
s->data[s->top]=e;
return true;
}
5、Pop(&s,&e)出棧
bool Pop(SqStack *&s,ElemType &e)
{
if (s->top==-1)
return false;
e=s->data[s->top];
s->top--;
return true;
}
6、用棧判斷對稱串算法
bool summetry(ElemType str[])
{
int i;
ElemType e;
SqStack *st;
InitStack(st);
// 將所有元素進(jìn)棧
for (i=0;str[i]!='\0';i++)
Push(str,str[i]);
// 出棧的字符與從左向右讀取的字符串比較
for(i=0;str[i]!='\0';i++)
{
Pop(st,e);
if(str[i]!=e)
{
DestroyStack(st);
return false;
}
}
DestroyStack(st);
return true;
}
1、棧的鏈?zhǔn)酱鎯?/p>
* 采用單鏈表: 頭結(jié)點后保存棧頂
* 優(yōu)點:不存在棧滿上溢的情況
* ??諚l件: s->next=NULL
定義:
typedef struct linknode
{
ElemType data;
struct linknode *next;
}LiStack;
2、建立一個空棧
void InitStack(LiStack *&s)
{
s=(LiStack *)malloc(sizeof(LiStack));
s->next=NULL;
}
3、釋放棧的全部占用空間
void DetroyStack(LiStack *&s)
{
LiStack *p=s, *q=s->next;
while (q!=NULL)
{
free(p);
p=q;
q=p->next;
}
free(p);
}
4、判斷棧是否為空
bool StackEmpty(LiStack *S)
{
return(s->next==NULL);
}
5、進(jìn)棧
void Push(LiStack *&s,ElemType e)
{
LiStack *p;
p=(LiStack *)malloc(sizeof(LiStack));
p->data=e;
p->next=s->next;
s->next=p;
}
6、 出棧
bool Pop(LiStack *&s, ElemType &e)
{
LiStack *p;
if (s->next==NULL)
return false;
p=s->next;
e=p->data;
s->next=p->next;
free(p);
return true;
}
7、取棧頂元素
bool GetTop(LiStack *s,ElemType &e)
{
if (s->next==NULL)
return false;
e=s->next->data;
return true;
}
隊列的數(shù)據(jù)操作:
隊列的存儲結(jié)構(gòu):
定義結(jié)構(gòu):
typedef struct
{
ElemType data[MaxSize];
int front,rear; //隊首和隊尾指針
} SqQueue;
1、順序隊的特性
2、初始化隊列
void InitQueue(SqQueue *&q)
{
q=(SqQueue *)malloc(sizeof(SqQueue));
q->front=q->rear=-1;
}
3、釋放隊列q所占的存儲空間
void DestroyQueue(SqQueue *&q)
{
free(q);
}
4、判斷隊列是否為空QueueEmpty
bool QueueEmpty(SqQueue *q)
{
return(q->front==q->rear);
}
5、進(jìn)隊列
bool enQueue(SqQueue *&q,ElemType e)
{
if (q->rear==MaxSize-1)
return false;
q->rear++
q->data[q->rear]=e;
return true;
}
6、出隊列
bool deQueue(SqQueue *&q,ElemType &e)
{
if (q->front==q->rear)
return false;
q->front++;
e=q->data[q->front];
return true;
}
提示:順序隊列在滿隊數(shù)據(jù)取完后,在隊空的情況下會出現(xiàn)front==rear&& rear = MaxSize - 1的情況,而出現(xiàn)這種情況后,無法再插入數(shù)據(jù),這就需要使用環(huán)形隊列。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。