39、sq(Sqlist *L){
int i;
for(i=1;i<=L->length;i++) printf("%5d",L->slist[i-1]);
return OK;
}/*PrintList*/
int ListInsert_sq(Sqlist *L,int i,ElemType e){
int k; if(i<1||i>L->length+1) return ERROR;
if(L->length>=L->listsize){
L->slist=(ElemType*)realloc(L->slist, (INIT_SIZE+INCREM)*sizeof(ElemTy
40、pe)); if(!L->slist)
return ERROR; L->listsize+=INCREM;
}
for(k=L->length-1;k>=i-1;k--){ L->slist[k+1]= L->slist[k];
}
L->slist[i-1]=e;
L->length++;
return OK;
}/*ListInsert*/ /* 在順序表中刪除第 i 個元素 */
int ListDelete_sq(Sqlist *L,int i){
}
/* 在順序表中查找指定值元素,返回其序號 */
int ListLocate(Sqlist *L,Elem
41、Type e){
}
int main(){
Sqlist sl;
int n,m,k;
printf("please input n:"); /* 輸入順序表的元素個數(shù) */ scanf("%d",&n);
if(n>0){
printf("\n1-Create Sqlist:\n");
InitList_sq(&sl);
CreateList_sq(&sl,n);
printf("\n2-Print Sqlist:\n");
PrintList_sq(&sl);
printf("\nplease input insert location and data:(loc
42、ation,data)\n"); scanf("%d,%d",&m,&k);
ListInsert_sq(&sl,m,k); printf("\n3-Print Sqlist:\n");
PrintList_sq(&sl); printf("\n");
}
else
printf("ERROR");
return 0;
} 運行結(jié)果(運行結(jié)果截屏粘貼到這里)
算法分析(參照教材上的“算法分析”部分填寫本部分內(nèi)容,
2、為第 1 題補充刪除和查找功能函數(shù),并在主函數(shù)中補充代碼驗證算法的正確性。 刪除算法代碼:
運行結(jié)果
算法分析
查找算法代碼:
運行結(jié)果
算法分析
43、
3、閱讀下面程序,在橫線處填寫函數(shù)的基本功能。并運行程序,寫出結(jié)果。
#in clude
#in clude
#defi ne ERROR 0
#defi ne OK 1
定義表元素的類型*/ 線性表的單鏈表存儲*/
typedef int ElemType; /* typedef struct LNode{ /*
ElemType data; struct LNode *n ext;
}LNode,*Li nkList;
LinkList CreateList(int n); /* void PrintList(LinkList L)
44、; /* int GetElem(LinkList L,int i,ElemType *e); /*
*/
輸出帶頭結(jié)點單鏈表的所有元素 */
*/
LinkList CreateList(int n){
LNode *p,*q,*head;
int i;
head=(L in kList)malloc(sizeof(LNode)); p=head;
for(i=0;i< n; i++){
q=(L in kList)malloc(sizeof(LNode)); data %i:",i+1);
scan f("%d",& q->data); /*
q-> next=N
45、ULL; /*
p_>n ext=q; /*
p=q;
}
retur n head;
}/*CreateList*/
head-> next=NULL;
prin tf("i nput
輸入元素值*/
結(jié)點指針域置空*/
新結(jié)點連在表末尾*/
void Prin tList(L in kList L){
LNode *p;
p=L->next; /*p 指向單鏈表的第 1個元素*/
while(p!=NULL){
prin tf("%5d",p->data);
p=p->n ext;
}
}/*Pri ntList*/
int GetElem(Lin
46、kList L,int i,ElemType *e){ LNode *p;int j=1;
p=L->n ext;
while(p&&jnext;j++;
}
if(!p||j>i)
return ERROR;
*e=p->data;
return OK;
}/*GetElem*/
int main(){
int n,i;ElemType e;
LinkList L=NULL; /* 定義指向單鏈表的指針 */ printf("please input n:"); /* 輸入單鏈表的元素個數(shù) */ scanf("%d",&n);
if(n>0){
47、
printf("\n1-Create LinkList:\n");
L=CreateList(n);
printf("\n2-Print LinkList:\n");
PrintList(L);
printf("\n3-GetElem from LinkList:\n");
printf("input i=");
scanf("%d",&i);
if(GetElem(L,i,&e))
printf("No%i is %d",i,e);
else
printf("not exists");
}else
printf("ERROR");
return 0;
}
運行
48、結(jié)果
算法分析
4、為第 3 題補充插入功能函數(shù)和刪除功能函數(shù)。 并在主函數(shù)中補充代碼驗證算法的正確性。 插入算法代碼:
運行結(jié)果
算法分析
刪除算法代碼:
運行結(jié)果
算法分析
以下為選做實驗:
5、循環(huán)鏈表的應用(約瑟夫回環(huán)問題)
n 個數(shù)據(jù)元素構成一個環(huán),從環(huán)中任意位置開始計數(shù),計到 m 將該元素從表中取出,重復上
述過程,直至表中只剩下一個元素。
提示:用一個無頭結(jié)點的循環(huán)單鏈表來實現(xiàn)
49、n 個元素的存儲。
算法代碼
6、設一帶頭結(jié)點的單鏈表,設計算法將表中值相同的元素僅保留一個結(jié)點。
提示:指針p從鏈表的第一個元素開始,利用指針 q從指針p位置開始向后搜索整個鏈表,
刪除與之值相同的元素;指針 p繼續(xù)指向下一個元素,開始下一輪的刪除,直至 p== null
為至,既完成了對整個鏈表元素的刪除相同值。
算法代碼
四、實驗小結(jié)
實驗二棧和隊列
一、實驗目的
1、 掌握棧的結(jié)構特性及其入棧,出棧操作;
2、 掌握隊列的結(jié)構特性及其入隊、出隊的操作,掌握循環(huán)隊列的特點及其操作。
二、實驗預習
說明以下概念
1、 順序棧:
2、 鏈棧:
3、 循環(huán)隊列:
50、
4、 鏈隊
、實驗內(nèi)容和要求
,運
1、閱讀下面程序,將函數(shù) Push和函數(shù)Pop補充完整。要求輸入元素序列
行結(jié)果如下所示。
#in clude
#in clude
#defi ne ERROR 0
#defi ne OK 1
#defi ne STACK_INT_SIZE 10 /*
#defi ne STACKINCREMENT 5 /* typedef int ElemType; /* typedef struct{
ElemType *base;
ElemType *top;
存儲空間初始分配量*/ 存儲空間
51、分配增量*/
定義元素的類型*/
int stacksize; /* }SqStack;
當前已分配的存儲空間 */
int InitStack(SqStack *S); /*
int push(SqStack *S,ElemType e); /* int Pop(SqStack *S,ElemType *e); /* int CreateStack(SqStack *S); /* void PrintStack(SqStack *S); /*
構造空棧 */
入棧 */
出棧 */
創(chuàng)建棧 */
出棧并輸出棧中元素 */
int InitStack(SqSta
52、ck *S){
S->base=(ElemType *)malloc(STACK_INT_SIZE *sizeof(ElemType)); if(!S->base) return ERROR;
S->top=S->base; S->stacksize=STACK_INT_SIZE;
return OK; }/*InitStack*/
int Push(SqStack *S,ElemType e){
}/*Push*/
int Pop(SqStack *S,ElemType *e){
}/*Pop*/
int CreateStack(SqStack *S){
int e;
i
53、f(InitStack(S)) printf("Init Success!\n");
else{ printf("Init Fail!\n"); return ERROR;
}
printf("input data:(Terminated by inputing a character)\n"); while(scanf("%d",&e))
Push(S,e);
return OK; }/*CreateStack*/
void PrintStack(SqStack *S){
ElemType e;
while(Pop(S,&e)) printf("%3d",e);
}/*Po
54、p_and_Print*/
int mai n(){
SqStack ss;
prin tf("\n1-createStack\n");
CreateStack(&ss);
prin tf("\n 2-Pop&Print\n");
Prin tStack(&ss);
return 0;
}
算法分析:輸入元素序列 1 2 3 4 5 ,為什么輸出序列為 5 4 3 2 1 ?體現(xiàn)了棧的什么
特性?
2、在第1題的程序中,編寫一個十進制轉(zhuǎn)換為二進制的數(shù)制轉(zhuǎn)換算法函數(shù)(要求利用棧來 實現(xiàn)),并驗證其正確性。
實現(xiàn)代碼
驗證
3、閱讀并運行程序,并分析程序功能。
#in
55、 clude
#in clude
#in clude
#defi ne M 20
#defi ne elemtype char typedef struct
{
elemtype stack[M];
int top;
}
stack no de;
void in it(stack node *st);
void push(stack node *st,elemtype x); void pop(stack node *st);
void in it(stack node *st)
{
st->top=0;
56、
}
void push(stack node *st,elemtype x)
{
if(st->top==M)
prin tf("the stack is overflow!' n");
else
{
st_>top=st_>top+1; st->stack[st->top]=x;
}
}
void pop(stack node *st)
{
if(st->top>0) st->top--;
else printf( Stack is Empty!' n ”;
}
int mai n()
{
char s[M];
int i;
stack node *s
57、p;
prin tf("create a empty stack!' n"); sp=malloc(sizeof(stack no de)); ini t(sp);
prin tf("i nput a expressi on:\n ”);
gets(s);
for(i=0;itop==0)
prin tf("'('match')'!\n");
else
printf("'('not match')'!\n");
58、
return 0;
}
輸入:2+((c-d)*6-(f-7)*a)/6
運行結(jié)果:
輸入:a-((c-d)*6-(s/3-x)/2
運行結(jié)果:
程序的基本功能:
以下為選做實驗:
4、設計算法,將一個表達式轉(zhuǎn)換為后綴表達式,并按照后綴表達式進行計算,得出表達式 得結(jié)果。
實現(xiàn)代碼
5、假設以帶頭結(jié)點的循環(huán)鏈表表示隊列, 并且只設一個指針指向隊尾結(jié)點 (不設隊頭指針) 試編寫相應的置空隊列、入隊列、出隊列的算法。
實現(xiàn)代碼:
四、實驗小結(jié)
實驗三 串的模式匹配
一、實驗目的
1 、了解串的基本概念
2 、掌握串的模式匹配算法的實現(xiàn)
二、實驗預習
說明以下
59、概念
1、模式匹配: 2、BF算法:
三、實驗內(nèi)容和要求
1 、閱讀并運行下面程序,根據(jù)輸入寫出運行結(jié)果。
#include
#include
#define MAXSIZE 100
typedef struct{
char data[MAXSIZE];
int length;
}SqString;
串的比較 */
int strCompare(SqString *s1,SqString *s2); /*
void show_strCompare();
void strSub(SqString *s,int start,int
60、sublen,SqString *sub);
/* 求子串 */
void show_subString();
int strCompare(SqString *s1,SqString *s2){
int i;
for(i=0;ilength&&ilength;i++) if(s1->data[i]!=s2->data[i]) return s1->data[i]-s2->data[i];
return s1->length-s2->length;
}
void show_strCompare(){
SqString s1,s2;
int k;
pri
61、ntf("\n***show Compare***\n");
printf("input string s1:"); gets(s1.data);
s1.length=strlen(s1.data); printf("input string s2:"); gets(s2.data);
s2.length=strlen(s2.data); if((k=strCompare(&s1,&s2))==0) printf("s1=s2\n");
else if(k<0)
printf("s1s2\n");
printf("\n***sh
62、ow over***\n");
}
void strSub(SqString *s,int start,int sublen,SqString *sub){ int i;
if(start<1||start>s->length||sublen>s->length-start+1){ sub->length=0;
}
for(i=0;idata[i]=s->data[start+i-1];
sub->length=sublen;
}
void show_subString(){
SqString s,sub;
int start,suble
63、n,i; printf("\n***show subString***\n"); printf("input string s:");
gets(s.data);
s.length=strlen(s.data); printf("input start:"); scanf("%d",&start); printf("input sublen:"); scanf("%d",&sublen); strSub(&s,start,sublen,&sub); if(sub.length==0)
printf("ERROR!\n");
else{
printf("subString is :")
64、; for(i=0;i
65、are();break; case 2:show_subString();break; default:n=0;break;
} }while(n); return 0;
}
BF 算法。
運行程序 輸入: 1 student students 2 Computer Data Stuctures 10 4 運行結(jié)果:
2 、實現(xiàn)串的模式匹配算法。補充下面程序,實現(xiàn)串的
#include
#include
#define MAXSIZE 100
typedef struct{
char data[MAXSIZE];
int length
66、;
}SqString;
int index_bf(SqString *s,SqString *t,int start); void getNext(SqString *t,int next[]);
int index_kmp(SqString *s,SqString *t,int start,int next[]);
void show_index();
int index_bf(SqString *s,SqString *t,int start){
補充代碼
}
void getNext(SqString *t,int next[]){
int i=0,j=-1;
next[0]=-1;
while(ilength){
if((j==-1)||(t->data[i]==t->data[j])){ i++;j++;next[i]=j;
}else
j=next[j];
}
}
void show_index(){
SqString s,t;
int k,next[MAXSIZE]={0},i;
printf("\n***show i