c语言数据结构基本操作.docx
- 文档编号:8960711
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:46
- 大小:23.64KB
c语言数据结构基本操作.docx
《c语言数据结构基本操作.docx》由会员分享,可在线阅读,更多相关《c语言数据结构基本操作.docx(46页珍藏版)》请在冰豆网上搜索。
c语言数据结构基本操作
/*顺序表的基本操作*/
#include
#include
#include
#include
#defineLength10
#defineLISTINCREMENT3
#defineTRUE1
#defineFALSE0
#defineOK1
#defineERROR-1
#defineOVERFLOW-2
typedefintStatus;
typedefintElemType;
typedefstructlineorder{
int*elem;
intlength;
intlistsize;
}SqList;
Statusinitlist_Sq(SqList&L)
/*初始化顺序表*/
{
L.elem=(ElemType*)malloc(sizeof(ElemType)*Length);
if(!
L.elem)exit(OVERFLOW);
L.listsize=Length;
L.length=0;
returnOK;
}
voiddestroylist(SqList&c)
/*销毁顺序表*/
{
free(c.elem);
c.elem=NULL;
c.length=0;
}
voidclearlist_Sq(SqList&c)
/*清空顺序表*/
{c.length=0;}
Statuslistempty_Sq(SqListc)
/*测试顺序表是否为空*/
{
if(c.length!
=0)return(FALSE);
return(TRUE);
}
StatusListInsert_Sq(SqList&L,inti,ElemTypee)
/*在第i个位置上插入一个元素*/
{intj,*newbase;
if(i<1||i>L.length+1)returnERROR;
if(L.length>=L.listsize){
newbase=(ElemType*)realloc(L.elem,(L.listsize+LISTINCREMENT)*sizeof(ElemType));
if(!
newbase)exit(OVERFLOW);
L.elem=newbase;L.listsize+=LISTINCREMENT;
}
for(j=L.length;j>=i;--j)
L.elem[j]=L.elem[j-1];
L.elem[j]=e;++L.length;
returnOK;
}
intLocateElem_Sq(SqListL,ElemTypee)/*返回元素e在顺序表中的位置*/
{inti=1;
ElemType*p=L.elem;
while(i<=L.length&&!
(*p==e))
{i++;p++;}
if(i<=L.length)returni;
returnFALSE;
}
StatusListDelete_Sq(SqList&L,inti,int&e)
/*删除第i个位置上的元素*/
{intj;
if(i<1||i>L.length)returnERROR;
e=L.elem[i-1];
for(j=i;j L.elem[j-1]=L.elem[j]; L.length--; returnOK; } voidPrint_Sq(SqListL)/*输出顺序表*/ {inti; if(listempty_Sq(L)) printf("\nSequentialList'slengthis%d.It'sempty! ",L.length); else printf("\nSequentialList'slengthis%d.Theseelementare: ",L.length); for(i=0;i printf("%d",L.elem[i]); } voidmenu() {printf("\n"); printf("\n**************************\n"); printf("1-------PrinttheSequentialList.\n"); printf("2-------InsertadataintheSequentialList.\n"); printf("3-------DeleteadataintheSequentialList.\n"); printf("4-------Getaelement'slocationtintheSqList.\n"); printf("5-------CleartheSequentialList.\n"); printf("6-------Exit.\n"); printf("**************************\n"); printf("\n"); } voidmenuselect(SqListL) {intk,i,done=1; ElemTypee; charch[10]; while(done) {menu(); printf("Pleasechoose: "); scanf("%d",&k); getchar(); switch(k) {case1: Print_Sq(L);break; case2: { printf("\nInputthelocationanddatayouwanttoInsert: "); scanf("%d,%d",&i,&e); if(ListInsert_Sq(L,i,e)==ERROR)printf("Insertlocationisnotcorrect! \n"); break; } case3: {printf("\nInputthelocationyouwanttodeletedata: "); scanf("%d",&i); if(ListDelete_Sq(L,i,e)==ERROR) printf("Deletelocationisnotexit! \n"); else printf("\nDeletedatais%d.",e); break;} case4: {printf("\nInputthedatayouwanttofind: "); scanf("%d",&e); if(LocateElem_Sq(L,e)! =FALSE) printf("\nData%dlocationintheSequentialListis%d,e,LocateElem_Sq(L,e)); elseprintf("\n%disnotintheSequentialList.\n",e); break;} case5: clearlist_Sq(L);;break; case6: done=0; } } } voidmain() {ElemTypee; SqListLa; intn,i; clrscr(); initlist_Sq(La); printf("InputanumberoftheelementintheSequentialList(n<=%d): ",Length); scanf("%d",&n); printf("Entertheseelements: "); for(i=1;i<=n;i++) {scanf("%d",&e); ListInsert_Sq(La,i,e);} menuselect(La); getch(); } /*顺序表的归并操作*/ union_Sq(SqList*La,SqListLb) {Int i,La_len=La->length,Lb_len=Lb.length,j; ElemTypee; for(i=1;i<=Lb_len;i++) { e=Lb.elem[i-1]; if(! LocateElem_Sq(La,e)) ListInsert_Sq(La,++La_len,e); } returnOK; } MergeList(SqListLa,SqListLb,SqList*Lc) {inti=1,j=1,k=0,La_len=La.length,Lb_len=Lb.length; ElemTypeai,bj; while((i<=La_len)&&(j<=Lb_len)) { ai=La.elem[i-1];bj=Lb.elem[j-1]; if(ai<=bj){ListInsert_Sq(Lc,++k,ai);i++;} else{ListInsert_Sq(Lc,++k,bj);j++;} } while(i<=La_len){ai=La.elem[-1+i++];ListInsert_Sq(Lc,++k,ai);} while(j<=Lb_len){bj=Lb.elem[-1+j++];ListInsert_Sq(Lc,++k,bj);} returnOK; } voidmain() {ElemTypee; SqListLa,Lb,Lc; intn,i; clrscr(); initlist_Sq(La); initlist_Sq(Lb); printf("\nInputanumberoftheelementintheSequentialListLa(n<=%d): ",Length); scanf("%d",&n); printf("\nEntertheseelements: "); for(i=1;i<=n;i++) {scanf("%d",&e); ListInsert_Sq(&La,i,e);} printf("\nInputanumberoftheelementintheSequentialListLb(n<=%d): ",Length); scanf("%d",&n); printf("\nEntertheseelements: "); for(i=1;i<=n;i++) {scanf("%d",&e); ListInsert_Sq(&Lb,i,e);} Print_Sq("La",La); printf("\n"); Print_Sq("Lb",Lb); union_Sq(&La,Lb); printf("\n"); Print_Sq("Laafterunion(La&Lb)",La); initlist_Sq(Lc); MergeList(La,Lb,&Lc); printf("\n"); Print_Sq("Lc(LaorLb)",Lc); printf("\n"); clearlist_Sq(Lc); Print_Sq("Lcafterclear",Lc); getch(); } /*单链表的基本操作*/ #include #include #include #defineTRUE1 #defineFALSE0 typedefintET; typedefET*Ep; typedefintStatus; typedefstructLNode {ETdata; structLNode*next; }LNode,*LinkList; /*逆序建立一个长度为n的单链表*/ voidCreatList(LinkList*L,intn) {inti; LinkListp,q; ETe; p=(LinkList)malloc(sizeof(LNode)); p->next=NULL; *L=q=p; printf("Pleaseinputthesedatas: "); for(i=n;i>0;i--) {p=(LinkList)malloc(sizeof(LNode)); scanf("%d",&e); p->data=e; p->next=q->next; q->next=p; } } /*初始化单链表*/ voidInit(LinkList*L) {intn; printf("Pleaseinputthenumberofthenode: "); scanf("%d",&n); CreatList(L,n); } /*打印单链表中的结点元素值*/ voidprintlk(LinkListL) {LinkListp; p=L->next; while(p){ printf("%d->",p->data); p=p->next; } printf("NULL\n"); } /*在单链表的第i个结点位置之后插入一个新结点*/ intListInsert(LinkListL,inti,ETe) {intj=0; LinkListp,s; p=L->next;/*指针p初始值指向第1个结点*/ while(p&&j {p=p->next; ++j; } if(! p||j>i-1)returnFALSE; s=(LinkList)malloc(sizeof(LNode)); s->data=e; s->next=p->next; p->next=s; returnTRUE; } /*删除单链表中的第i个结点*/ intListDelete(LinkListL,inti,ET*e) {LinkListp,q; intj=0; p=L;/*指针p初始值指向头结点*/ while(p&&j {p=p->next; ++j; } if(! (p->next)||(j>i-1)) returnFALSE; q=p->next;/*指针q指向要删除的第i个结点位置*/ p->next=q->next; *e=q->data; free(q); returnTRUE; } intInsert(LinkListL)/*插入函数*/ {inti,flag; ETdata; printf("\nPleaseinputtheinsertposition: "); scanf("%d",&i); printf("InputthedatayouwanttoInsert: "); scanf("%d",&data); flag=ListInsert(L,i,data); returnflag; } StatusDelete(LinkListL)/*删除函数*/ {inti,flag; ETe; printf("\nPleaseinputthedeleteposition: "); scanf("%d",&i); flag=ListDelete(L,i,&e); if(flag==TRUE) printf("Deletedelementis%d\n",e); returnflag; } /*取单链表中第i个结点的数据元素值*/ intGetElem(LinkListL,inti,ET&e) {intj=1; LinkListp; p=L->next; while(p&&j {p=p->next; ++j; } if(! p||j>i)returnFALSE; e=p->data; returnTRUE; } StatusGetElem_List(LinkListL) {inti,flag; ETe; printf("\nPleaseinputtheposition: "); scanf("%d",&i); flag=GetElem(L,i,e); if(flag==TRUE) printf("Getelementis%d\n",e); returnflag; } /*在单链表中查询第一个满足判定条件的数据元素*/ /*若存在,则返回它的位序,否则返回0*/ intLocateElem(LinkListL,ETe) {inti=0; LinkListp; p=L->next; while(p) {i++; if(p->data==e)returni; elsep=p->next; } return0; } StatusLocateElem_List(LinkListL) {inti,flag; ETe; printf("\nPleaseinputtheelement: "); scanf("%d",&e); flag=LocateElem(L,e); if(flag) printf("Locationofa%dintheLAis%d\n",e,flag); returnflag; } /*栈的基本操作源程序*/ #include"stdio.h" #include"stdlib.h" #include"alloc.h" #include"conio.h" #defineTRUE1 #defineFALSE0 #defineOK1 #defineERROR0 #defineOVERFLOW2 #defineSTACK_INIT_SIZE10 #defineSTACKINCREMENT2 typedefcharET; typedefintStatus; typedefstructstack{ ET*base,*top; intstacksize; }Stack; StatusInitStack(Stack*S) { S->base=(ET*)malloc(STACK_INIT_SIZE*sizeof(ET)); if(! S->base)exit(OVERFLOW); S->top=S->base; S->stacksize=STACK_INIT_SIZE; returnOK; } StatusGetTop(Stack*S,ET*e) {if(S->top==S->base)returnERROR; *e=*(S->top-1); returnOK; } StatusPush(Stack*S,ETe) {if(S->top-S->base>=S->stacksize) {S->base=(ET*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ET)); if(! S->base)exit(OVERFLOW); S->top=S->base+S->stacksize; S->stacksize+=STACKINCREMENT; } *S->top++=e; returnOK; } StatusPop(Stack*S,ET*e) {if(S->top==S->base)returnERROR; *e=*--S->top; returnOK; } StatusStackEmpty(Stack*S) {if(S->top==S->base)returnTRUE; elsereturnFALSE; } voidDestroy_Stack(Stack*S) {if(S->base)free(S->base); S->base=NULL; S->top=NULL; S->stacksize=0; } voidClear_Stack(Stack*S) {S->top=S->base; } voidmenu() {printf("\n**************************\n"); printf("1-------InsertadataintheStack.\n"); printf("2-------DeletetheStacktopdataintheStack.\n"); printf("3-------PrintStacktopelement.\n"); printf("4-------CleartheStack.\n"); printf("5-------DestroytheStack.\n"); printf("6-------Exit.\n"); printf("**************************\n"); } voidmenuselect(Stack*S) {intk,done=1; ETe; charch[10]; while(done) {menu(); printf("Pleasechoose: "); scanf("%d",&k); getchar(); switch(k) {case1: { printf("InputthedatayouwanttoInsert: "); scanf("%c",&e); getchar(); printf("\n"); Push(S,e); b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 数据结构 基本 操作