实验一 线性表及其应用.docx
- 文档编号:3291850
- 上传时间:2022-11-21
- 格式:DOCX
- 页数:18
- 大小:19.35KB
实验一 线性表及其应用.docx
《实验一 线性表及其应用.docx》由会员分享,可在线阅读,更多相关《实验一 线性表及其应用.docx(18页珍藏版)》请在冰豆网上搜索。
实验一线性表及其应用
实验一线性表及其应用
09计算机1白杨0929210028
(一)顺序表操作验证
1.问题描述
对以顺序存储结构存储的线性表,验证其插入、删除、查找、就地逆置等操作。
2.基本要求
用菜单实现操作选择。
3.测试数据
自拟。
(三)单链表操作验证
1.问题描述
对以链式存储结构存储的线性表,验证其插入、删除、查找、求长度和就地逆置等操作。
2.基本要求
用菜单实现操作选择。
3.测试数据
自拟。
说明:
选做实验内容详见实验手册
/*顺序表操作验证*/
#include
#include
#include
#include
typedefstruct
{
int*elem;
intlength;
intlistsize;
}SqList;
//初始化顺序表
intInit(SqList&L)
{
L.elem=(int*)malloc(100*sizeof(int));
if(!
L.elem)
return0;
L.length=0;
L.listsize=100;
return1;
}
//清空顺序表
voidClear(SqList&L)
{
free(L.elem);
L.elem=NULL;
L.length=0;
}
//在第i个位置上插入一个元素
intInsert(SqList&L,inti,inte)
{
intj,*newbase;
if(i<1||i>L.length+1)return0;
if(L.length>=L.listsize)
{
newbase=(int*)realloc(L.elem,(L.listsize+1)*sizeof(int));
if(!
newbase)
return0;
L.elem=newbase;
L.listsize++;
}
for(j=L.length;j>=i;--j)
{
L.elem[j]=L.elem[j-1];
}
L.elem[j]=e;
L.length++;
return1;
}
//返回元素e在顺序表中的位置
intLocate(SqListL,inte)
{
inti=1;
int*p;
p=L.elem;
while(i<=L.length&&!
(*p==e))
{
i++;
p++;
}
if(i<=L.length)returni;
return0;
}
//删除第i个位置上的元素
intDelete(SqList&L,inti,int&e)
{
intj;
if(i<1||i>L.length)return0;
e=L.elem[i-1];
for(j=i;j L.elem[j-1]=L.elem[j]; L.length--; return1; } //就地逆置 voidReverse(SqList&L) { inti,tmp; for(i=0;i { tmp=L.elem[i]; L.elem[i]=L.elem[L.length-i-1]; L.elem[L.length-i-1]=tmp; } } //输出顺序表 voidPrint(SqListL) { inti; printf("%d\n",L.length); for(i=0;i printf("%d",L.elem[i]); printf("\n"); } //菜单函数 intmenu(void) { intnum; //clrscr(); printf("\n\n"); printf(" MENU \n"); printf(" ===========================\n"); printf(" Sq-listoperation\n"); printf(" 1.print\n"); printf(" 2.insert\n"); printf(" 3.delete\n"); printf(" 4.Locate\n"); printf(" 5.clear\n"); printf(" 6.init\n"); printf(" 7.reverse\n"); printf(" 0.exit \n"); printf(" ===========================\n"); printf(" Choice(0,1,2,3,4,5,6,7): "); scanf("%d",&num); returnnum; } intmain() { intInit(SqList&L); //初始化顺序表 voidClear(SqList&L); //清空顺序表 intInsert(SqList&L,inti,inte); //在第i个位置上插入一个元素 intLocate(SqListL,inte); //返回元素e在顺序表中的位置 intDelete(SqList&L,inti,int&e);//删除第i个位置上的元素 voidPrint(SqListL); //输出顺序表 voidReverse(SqList&L); //就地逆置 intmenu(void); //菜单函数 intn,i,e,k; SqListL; Init(L); boolflag=1; //clrscr(); do{ intnum=menu(); switch(num) { case1: Print(L); break; case2: printf("Inputnumberstocreatlist(endby=0): "); scanf("%d",&n); while(n--) { printf("inputlocationtoinsertbefore.i="); scanf("%d",&i); printf("inputanumbertoinsert.e="); scanf("%d",&e); if(! Insert(L,i,e)) { printf("Insertlocationisnotcorrect! \n"); n++; printf("Pleaseinputlocationtoinsertagain.\n"); } } break; case3: printf("inputalocationtodelete.i="); scanf("%d",&i); k=Delete(L,i,e); if(! k) printf("Deletelocationisnotexit! \n"); else printf("Deletedatais%d.\n",e); break; case4: printf("inputanumbertolocate.e="); scanf("%d",&e); k=Locate(L,e); if(! k) printf("Data%dlocationisnotexit! \n",e); elseprintf("Thelocationof%dis: %d.",e,k); break; case5: Clear(L); Init(L); break; case6: Init(L); break; case7: Reverse(L); break; case0: flag=0; } }while(flag==1); return0; } /*测试数据 6 2 4 5 3 1 1 2 3 3 4 4 5 1 4 2 4 3 2 1 2 2 1 7 1 5 0 */ /*单链表操作验证*/ #include #include #include #include typedefstructNode { intdata;//数据域 Node*next;//指针域 }List; //初始化链表运算 voidInit(List*&T)//*&T可以改变主函数中T的值 { T=(List*)malloc(sizeof(List));//创建头结点*T T->next=NULL; } //头插法建表 voidCreate_head(List*&T,intn) { List*s; inti; for(i=0;i { s=(List*)malloc(sizeof(List)); scanf("%d",&s->data); s->next=T->next;//让节点始终指向第一个节点(head紧接着的那个节点) T->next=s;//然后断开原先的头节点和第一个节点并头节点指向新的节点s,如此反复 } } //尾插法建表 voidCreate_tail(List*&T,intn) { List*s,*r; inti; r=T;//r始终指向尾结点,开始时指向头结点 for(i=0;i { s=(List*)malloc(sizeof(List)); scanf("%d",&s->data); r->next=s;//将*s插入*r之后 r=s; } r->next=NULL;//尾结点next域置为NULL } //链表长度运算 intLength(List*T) { intlen=0; List*p=T->next; while(p! =NULL) { p=p->next; len++; } returnlen; } //求链表第i个元素运算 intGetelm(List*T,inti,int&e)//&e表示不需要返回e的值,直接在调用函数里改变其值 { intj=1; List*p=T->next; if(i<1||i>Length(T))return0;//i参数不正确,返回0 while(j { p=p->next; j++; } e=p->data; return1; } //按值查找运算 intLocate(List*T,intx) { inti=1; List*p=T->next; while(p! =NULL&&p->data! =x)//从第1个结点开始查找data域为x的结点 { p=p->next; i++; } if(p==NULL)return0; elsereturni; } //插入结点运算 intInsert(List*&T,intx,inti) { intj=1; List*p=T,*s; s=(List*)malloc(sizeof(List));//创建data域为x的结点 s->data=x; s->next=NULL; if(i<1||i>Length(T)+1)return0;//i参数不正确,插入失败,返回0 while(j { p=p->next;//从头结点开始找,查找第i-1个结点,由p指向它 j++; } s->next=p->next;//将*p0的next域指向*p的下一个结点(即第i个结点) p->next=s;//将*p的next域指向*p0,这样*p0变成第i个结点 return1;//插入运算成功,返回1 } //删除结点运算 intDelet(List*&T,inti,int&e) { intj=1; List*p=T,*s; s=(List*)malloc(sizeof(List)); if(i<1||i>Length(T))return0;//i参数不正确 while(j { p=p->next; j++; } s=p->next;//由p0指向第i个结点 e=s->data; p->next=s->next;//将*p的next域指向*p0之后结点,即从链表中删除第i个结点 free(s);//释放第i个结点占用的空间 return1; } //就地逆置 voidReverse(List*&T) { List*p,*q; p=T->next; if(p&&p->next)//当链表不是空表或单结点时 { q=p->next; p->next=NULL;//将开始结点变成终端结点 while(q) { p=q; q=q->next; p->next=T->next; T->next=p; } T->next=p; } } //合并两个链表 List*Connect(List*la,List*lb) { List*pa=la->next; List*pb=lb->next; List*lc; List*pc=lc=la;//把A的头结点作为C的头结点 while(pa&&pb) { if(pa->data { pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; //pa=pa->next;删除重复的 } } pc->next=pa? pa: pb; free(lb); returnlc; } //输出链表运算 voidPrint(List*T) { List*p; for(p=T->next;p->next! =NULL;p=p->next) printf("%d",p->data); printf("%d\n",p->data); } //菜单 intmenu() { intnum; //clrscr(); printf("\n\n"); printf(" MENU \n"); printf(" ===========================\n"); printf(" Link-listoperation\n"); printf(" 1.creat_tail\n"); printf(" 2.insert\n"); printf(" 3.delete\n"); printf(" 4.print\n"); printf(" 5.getelement\n"); printf(" 6.length\n"); printf(" 7.reverse\n"); printf(" 8.connect\n"); printf(" 9.creat_head\n"); printf(" 0.exit\n"); printf(" ===========================\n"); printf(" Choice(0,1,2,3,4,5,6,7,8,9): "); scanf("%d",&num); returnnum; } intmain() { //freopen("d: //data.in","r",stdin); //freopen("d: //data.out","w",stdout); voidInit(List*&T); //初始化链表运算 voidCreate_head(List*&T,intn); //头插法建表 voidCreate_tail(List*&T,intn); //尾插法建表 intLength(List*T); //链表长度运算 intGetelm(List*T,inti,int&e); //求链表第i个元素运算 intLocate(List*T,intx); //按值查找运算 intInsert(List*&T,intx,inti); //插入结点运算 intDelet(List*&T,inti,int&e); //删除第i个结点运算 voidReverse(List*&T); //就地逆置 List*Connect(List*T1,List*T2); //合并两个链表(两个有序合并成一个有序) voidPrint(List*T); //输出链表运算 intmenu(void); //菜单函数 List*head,*la,*lb; inti,k,x,n; boolflag=1; do{ intnum=menu(); //clrscr();//清屏 switch(num) { case1: printf("Inputnumberstocreat_taillist: "); scanf("%d",&n); Init(head); printf("Inputthe%dDatas: ",n); Create_tail(head,n); break; case2: printf("inputlocati
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验一 线性表及其应用 实验 线性 及其 应用