日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

SLinkList(静态链表)

發(fā)布時(shí)間:2024/10/12 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SLinkList(静态链表) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

// stdafx.h : 標(biāo)準(zhǔn)系統(tǒng)包含文件的包含文件,
// 或是常用但不常更改的項(xiàng)目特定的包含文件
//

#define TRUE 1
#define FLASE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
#define NULL 0

typedef int Status;
typedef char ElemType;

#define MAXSIZE 1000 //鏈表的最大長(zhǎng)度
typedef struct{
ElemType data;
int cur; //注意這里不是指針,而是類似游標(biāo)的指示器
}component,SLinkList[MAXSIZE];

// 這是使用應(yīng)用程序向?qū)傻?VC++
// 應(yīng)用程序項(xiàng)目的主項(xiàng)目文件。
// 靜態(tài)鏈表的表示和實(shí)現(xiàn)

#include "stdafx.h"
#include "stdio.h"
#include "malloc.h"
#include "stdlib.h" //需要exit所加頭文件
#include "iostream.h"
#include <stdlib.h>

#using <mscorlib.dll>
#include <tchar.h>

using namespace System;

int LocateElem(SLinkList L,ElemType e){
// 這里和下面的space備用鏈表是沒(méi)有關(guān)系的,就因?yàn)榈?個(gè)和第1個(gè)分量的指向不同
// 在靜態(tài)單鏈線性表L中查找第1個(gè)值為e的元素。
// 若找到,則返回它在L中的位序,否則返回0。
int i;
i=L[0].cur;
while(i && L[i].data==e)
i=L[i].cur;
return i;
} //LocateElem

Status DisplayList(SLinkList L){
// 輸出靜態(tài)鏈表L
int i,j;
i=L[1].cur;
j=1;
if(i==0)
cout<<"靜態(tài)鏈表為空!"<<endl;
else
while(i){
cout<<"靜態(tài)鏈表第"<<j<<"個(gè)結(jié)點(diǎn)是:"<<L[i].data<<endl;
i=L[i].cur;
j++;
}
return OK;
}

void InitSpace(SLinkList &space){
// 將一維數(shù)組space中各分量鏈成一個(gè)備用鏈表,space[0].cur為頭指針
// “0”表示空指針
int i;
for(i=0;i<MAXSIZE-1;++i)
space[i].cur=i+1;
space[MAXSIZE-1].cur=0;
} //InitSpace

int Malloc_SL(SLinkList &space){
// 若備用空間鏈表非空,則返回分配的結(jié)點(diǎn)下標(biāo),否則返回0
// 即把備用鏈表的一個(gè)結(jié)點(diǎn)釋放出來(lái),但還沒(méi)具體鏈接到靜態(tài)
// 鏈表中。如果備用鏈表沒(méi)有空間的話,返回0(因?yàn)榇藭r(shí)space[0].cur=0)
int i;
i=space[0].cur;
if(space[0].cur)
space[0].cur=space[i].cur;
return i;
} //Malloc_SL

void Free_SL(SLinkList &space,int k){
// 將下標(biāo)為k的空閑結(jié)點(diǎn)回收到備用鏈表。
// 即把靜態(tài)鏈表中要?jiǎng)h除的結(jié)點(diǎn)k釋放出來(lái),鏈接到備用鏈表中,
// 但靜態(tài)鏈表中k結(jié)點(diǎn)的前驅(qū)和后繼還沒(méi)有處理。最后返回刪除結(jié)點(diǎn)k.
space[k].cur=space[0].cur;
space[0].cur=k;
} //Free_SL

void difference(SLinkList &space,int &S){
// 依次輸入集合A和B的元素,在一維數(shù)組space中建立表示集合(A-B)∪(B-A)
// 的靜態(tài)鏈表,S為其頭指針(靜態(tài)鏈表的頭指針)。假設(shè)備用空間足夠大,
// space[0].cur為其頭指針(備用鏈表的頭指針)。
// S這個(gè)參數(shù)的存在是為了可以把頭指針?lè)旁阪湵淼娜魏挝恢?#xff0c;不局限于第一元素位置。
int r;
InitSpace(space); //初始化備用鏈表
S=Malloc_SL(space); //生成S的頭結(jié)點(diǎn),即靜態(tài)鏈表的頭指針
r=S; //r指向S的當(dāng)前最后結(jié)點(diǎn)

int m,n;
cout<<"請(qǐng)您輸入集合A的元素個(gè)數(shù)m=";
cin>>m;
cout<<endl;

int i,j;
for(j=1;j<=m;++j){ //建立集合A的鏈表
i=Malloc_SL(space); //分配結(jié)點(diǎn),欲給靜態(tài)鏈表
cin>>(space[i].data); //輸入A的元素值
space[r].cur=i; //插入到靜態(tài)鏈表的表尾
r=i; //r指向靜態(tài)鏈表的表尾
}//for
space[r].cur=0; //靜態(tài)鏈表的表尾指針為空
DisplayList(space); //輸出A的元素
cout<<endl;

cout<<"B的元素個(gè)數(shù)n=";
cin>>n;
cout<<"下面請(qǐng)逐個(gè)輸入B的元素"<<endl;

ElemType b;
int p,k;
for(j=1;j<=n;++j){ //依次輸入B的元素,若不在當(dāng)前表中,則插入,否則刪除
cin>>b;
p=S;
k=space[S].cur; //k指向集合A的第一個(gè)結(jié)點(diǎn)
while(k!=space[r].cur && space[k].data!=b){ //在當(dāng)前靜態(tài)鏈表A中查找
p=k;
k=space[k].cur;
}//while
if(k==space[r].cur){ //當(dāng)前表A中不存在該元素,插入在r所指結(jié)點(diǎn)之后,且r的位置不變。
i=Malloc_SL(space);
space[i].data=b;
space[i].cur=space[r].cur;
space[r].cur=i;
}//if
else{ //該元素已在表中,刪除之
space[p].cur=space[k].cur;
Free_SL(space,k);
if(r==k) //若刪除的是靜態(tài)鏈表A中r所指結(jié)點(diǎn),則需修改A的尾指針。
r=p;
}//else
}//for
}//difference

// 這是此應(yīng)用程序的入口點(diǎn)
int _tmain(void)
{
// TODO: 請(qǐng)用您自己的代碼替換下面的示例代碼。
int S=1;
SLinkList space;
difference(space,S);
DisplayList(space);
return 0;
}


/*********************************************************************
這里的靜態(tài)鏈表需要注意是的:
1、我現(xiàn)在把靜態(tài)鏈表當(dāng)成是用著的鏈表!!!不包括備用那些結(jié)點(diǎn);
2、初始化時(shí),把整個(gè)結(jié)構(gòu)體數(shù)組初始化成一個(gè)備用鏈表;
3、靜態(tài)鏈表和備用鏈表共用原來(lái)初始化的空間;
4、當(dāng)tmain函數(shù)中的S=1時(shí),初始化后的空間里,第0個(gè)元素和第1個(gè)元素的位置數(shù)據(jù)域
是空的。第0個(gè)用來(lái)指示備用鏈表第一個(gè)元素的位子,第1個(gè)則用來(lái)指示靜態(tài)鏈表
第一個(gè)元素的位子,而且在這個(gè)思路中一直都是這樣的!(當(dāng)然你可以采取另一種
方式實(shí)現(xiàn),在此不討論);
5、Malloc_SL操作時(shí),它所做的動(dòng)作只是從備用鏈表釋放一個(gè)結(jié)點(diǎn),但釋放出來(lái)的這
個(gè)結(jié)點(diǎn)還沒(méi)具體鏈接到靜態(tài)鏈表中;
6、Free_SL操作時(shí),動(dòng)作只是把靜態(tài)鏈表中要?jiǎng)h除的結(jié)點(diǎn)釋放出來(lái),鏈接到備用鏈表中,
但靜態(tài)鏈表中k結(jié)點(diǎn)的前驅(qū)和后繼還沒(méi)有處理;
7、當(dāng)你把B中的元素往A插時(shí),B的元素一直順著沒(méi)改變以前的A尾插,而不是插在已經(jīng)插
入元素的后面結(jié)點(diǎn),比方說(shuō),依次插m,n兩元素到A,那么先插m,就是:A-m;然后插
n,就是:A-n-m;
8、如果你老是想不明白,那么你就認(rèn)認(rèn)真真畫圖!畫圖,再畫圖,不要怕煩!你就明白了
*********************************************************************/

/*********************************************************************
附:

靜態(tài)鏈表:由系統(tǒng)在內(nèi)存中開(kāi)辟了固定的、互不連續(xù)的存儲(chǔ)單元,在程序執(zhí)行過(guò)程中不可
能人為地再產(chǎn)生新的存儲(chǔ)單元,它跟順序結(jié)構(gòu)沒(méi)關(guān)系

靜態(tài)鏈表其實(shí)就是用數(shù)組來(lái)描述的鏈表,一般是用于不設(shè)指針類型的語(yǔ)言,很少在C語(yǔ)
言中使用。不是順序結(jié)構(gòu)

difference(SLinkList &space,int &S)中的參數(shù)S=1時(shí),有下面:
靜態(tài)鏈表是這樣的,在一個(gè)數(shù)組中有兩個(gè)元素是不用的,分別是第0個(gè)元素和第1個(gè)元
素,第0個(gè)用來(lái)指示備用空間的第一個(gè)元素的位子,第1個(gè)則用來(lái)指示第一個(gè)鏈表元素
的位子,每當(dāng)從鏈表中刪除一個(gè)元素時(shí).則讓該元素成為備用鏈表的第一個(gè)結(jié)點(diǎn),也即
讓數(shù)組的第0個(gè)元素指向刪除的結(jié)點(diǎn),然后讓刪除的結(jié)點(diǎn)指向原來(lái)的備用鏈表的第1個(gè)
結(jié)點(diǎn),插入的話類似
**********************************************************************/

轉(zhuǎn)載于:https://www.cnblogs.com/yujun543/archive/2012/09/11/2680742.html

總結(jié)

以上是生活随笔為你收集整理的SLinkList(静态链表)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。