2.8和2.9在带头结点的链表中实现插入和获取元素的操作
#include<stdio.h> #include<stdlib.h> #include<math.h> typedef int Status ; typedef int ElemType; #define OK 1 #define ERROR 0 typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(struct LNode)); if(!*L) exit(OVERFLOW); (*L)->next=NULL; return OK; } Status ListInsert(LinkList L,int i,ElemType e) { int j=0; LinkList p=L,s; while(p&&j<i-1) { p=p->next; ++j; } if(!p||j>i-1) return ERROR; s=(LinkList)malloc(sizeof(struct LNode)); s->data=e; s->next=p->next; p->next=s; return OK; } Status GetElem(LinkList L,int i,ElemType *e) { int j=0; LinkList p=L; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return ERROR; *e=p->data; return OK; } void main() { LinkList L; ElemType e; int j; InitList(&L); for(j=1;j<=5;j++) ListInsert(L,j,j); printf("L="); for(j=1;j<=5;j++) { GetElem(L,j,&e); printf("%d ",e); } printf("\n"); }
程序运行如下:
2.10在带头结点的链表中实现删除元素操作
#include<stdio.h> #include<stdlib.h> #include<math.h> typedef int Status ; typedef int ElemType; #define OK 1 #define ERROR 0 typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(struct LNode)); if(!*L) exit(OVERFLOW); (*L)->next=NULL; return OK; } Status ListInsert(LinkList L,int i,ElemType e) { int j=0; LinkList p=L,s; while(p&&j<i-1) { p=p->next; ++j; } if(!p||j>i-1) return ERROR; s=(LinkList)malloc(sizeof(struct LNode)); s->data=e; s->next=p->next; p->next=s; return OK; } Status GetElem(LinkList L,int i,ElemType *e) { int j=0; LinkList p=L; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return ERROR; *e=p->data; return OK; } Status ListDelete(LinkList *L,int i,ElemType *e) { int j=0; LinkList p=*L,q; while(p&&j<i-1) { p=p->next; ++j; } if(!p||j>i-1) return ERROR; q=p->next; p->next=q->next; *e=q->data; free(q); return OK; } void main() { LinkList L; ElemType e; int j; InitList(&L); for(j=1;j<=5;j++) ListInsert(L,j,j); printf("L="); for(j=1;j<=5;j++) { GetElem(L,j,&e); printf("%d ",e); } printf("\n"); ListDelete(&L,2,&e); printf("删除链表L中的第2个元素\n"); for(j=1;j<=4;j++) { GetElem(L,j,&e); printf("%d ",e); } printf("\n"); }
程序运行如下:
2.11在带头结点的链表中,实现逆位序输入n个元素
#include<stdio.h> #include<stdlib.h> #include<math.h> typedef int Status ; typedef int ElemType; #define OK 1 #define ERROR 0 typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; void CreateList(LinkList *L,int n) //实现逆位序输入n个元素) { int i; LinkList p; *L=(LinkList)malloc(sizeof(struct LNode)); if(!*L) exit(OVERFLOW); (*L)->next=NULL; for(i=n;i>0;i--) { p=(LinkList)malloc(sizeof(struct LNode)); if(!p) exit(OVERFLOW); scanf("%d",&((*L)->data)); p->next=*L; *L=p; } } Status GetElem(LinkList L,int i,ElemType *e) { int j=0; LinkList p=L; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return ERROR; *e=p->data; return OK; } Status ListDelete(LinkList *L,int i,ElemType *e) { int j=0; LinkList p=*L,q; while(p&&j<i-1) { p=p->next; ++j; } if(!p||j>i-1) return ERROR; q=p->next; p->next=q->next; *e=q->data; free(q); return OK; } void main() { LinkList L; ElemType e; int j,k; printf("请输入打算建立的带有头结点的链表结点个数:"); scanf("%d",&k); CreateList(&L,k); for(j=1;j<=k;j++) { GetElem(L,j,&e); printf("%d ",e); } printf("\n"); }
程序运行如下:
2.12将两个有序链表并为一个有序链表
#include<stdio.h> #include<stdlib.h> #include<math.h> typedef int Status ; typedef int ElemType; #define OK 1 #define ERROR 0 typedef struct LNode { ElemType data; struct LNode *next; }LNode,*LinkList; Status InitList(LinkList *L) { *L=(LinkList)malloc(sizeof(struct LNode)); if(!*L) exit(OVERFLOW); (*L)->next=NULL; return OK; } Status ListInsert(LinkList *L,int i,ElemType e) { int j=0; LinkList p=*L,s; while(p&&j<i-1) { p=p->next; ++j; } if(!p||j>i-1) return ERROR; s=(LinkList)malloc(sizeof(struct LNode)); s->next=p->next; p->next=s; s->data=e; return OK; } Status GetElem(LinkList L,int i,ElemType *e) { int j=0; LinkList p=L; while(p&&j<i) { p=p->next; ++j; } if(!p||j>i) return ERROR; *e=p->data; return OK; } void MergeList(LinkList *La,LinkList *Lb,LinkList *Lc) { LinkList pa,pb,pc; pa=(*La)->next; pb=(*Lb)->next; *Lc=pc=*La; while(pa&&pb) { if(pa->data<=pb->data) { pc->next=pa; pc=pa; pa=pa->next; } else { pc->next=pb; pc=pb; pb=pb->next; } } pc->next=pa?pa:pb; free(*Lb); } void main() { LinkList La,Lb,Lc,c; ElemType e; int j; InitList(&La); for(j=1;j<=5;j++) ListInsert(&La,j,j); printf("La="); for(j=1;j<=5;j++) { GetElem(La,j,&e); printf("%d ",e); } printf("\n"); InitList(&Lb); for(j=1;j<=5;j++) ListInsert(&Lb,j,2*j); printf("Lb="); for(j=1;j<=5;j++) { GetElem(Lb,j,&e); printf("%d ",e); } printf("\n"); MergeList(&La,&Lb,&Lc); printf("Lc="); c=Lc->next; while(c) { printf("%d ",c->data); c=c->next; } printf("\n"); }
程序运行结果如下:
时间: 2024-10-14 07:15:21