1、数据结构例题123例一:#include /*包含输入输出头文件*/#includeSeqList.h /*包含顺序表实现文件*/void DelElem(SeqList *A,SeqList B); /*删除A中出现B的元素的函数声明*/void main() int i,j,flag; DataType e; SeqList A,B; /*声明顺序表A和B*/ InitList(&A); /*初始化顺序表A*/ InitList(&B); /*初始化顺序表B*/ for(i=1;i=10;i+) /*将1-10插入到顺序表A中*/ if(InsertList(&A,i,i)=0) prin
2、tf(位置不合法); return; for(i=1,j=1;j=6;i=i+2,j+) /*插入顺序表B中六个数*/ if(InsertList(&B,j,i*2)=0) printf(位置不合法); return; printf(顺序表A中的元素:n); for(i=1;i=A.length;i+) /*输出顺序表A中的每个元素*/ flag=GetElem(A,i,&e); /*返回顺序表A中的每个元素到e中*/ if(flag=1) printf(%4d,e); printf(n); printf(顺序表B中的元素:n); for(i=1;i=B.length;i+) /*输出顺序表B
3、中的每个元素*/ flag=GetElem(B,i,&e); /*返回顺序表B中的每个元素到e中*/ if(flag=1) printf(%4d,e); printf(n); printf(将在A中出现B的元素删除后A中的元素:n); DelElem(&A,B); /*将在顺序表A中出现的B的元素删除*/ for(i=1;i=A.length;i+) /*显示输出删除后A中所有元素*/ flag=GetElem(A,i,&e); if(flag=1) printf(%4d,e); printf(n); void DelElem(SeqList *A,SeqList B)/*删除A中出现B的元素
4、的函数实现*/ int i,flag,pos; DataType e; for(i=0;i0) DeleteList(A,pos,&e); /*如果找到该元素,将其从A中删除*/ 重点1:#define ListSize 100typedef int DataType;typedef struct DataType listListSize; int length;SeqList;void InitList(SeqList *L) /*将线性表初始化为空的线性表只需要把线性表的长度length置为0*/ L-length=0; /*把线性表的长度置为0*/int ListEmpty(SeqLi
5、st L) /*判断线性表是否为空,线性表为空返回1,否则返回0*/ if(L.length=0) /*判断线性表的长度是否为9*/ return 1; /*当线性表为空时,返回1;否则返回0*/ else return 0;int GetElem(SeqList L,int i,DataType *e) /*查找线性表中第i个元素。查找成功将该值返回给e,并返回1表示成功;否则返回-1表示失败。*/ if(iL.length) /*在查找第i个元素之前,判断该序号是否合法*/ return -1; *e=L.listi-1; /*将第i个元素的值赋值给e*/ return 1;int Loc
6、ateElem(SeqList L,DataType e) /*查找线性表中元素值为e的元素,查找成功将对应元素的序号返回,否则返回0表示失败。*/ int i; for(i=0;iL.length;i+) /*从第一个元素开始比较*/ if(L.listi=e) return i+1; return 0;int InsertList(SeqList *L,int i,DataType e) /*在顺序表的第i个位置插入元素e,插入成功返回1,如果插入位置不合法返回-1,顺序表满返回0*/ int j; if(iL-length+1) /*在插入元素前,判断插入位置是否合法*/ printf(
7、插入位置i不合法!n); return -1; else if(L-length=ListSize) /*在插入元素前,判断顺序表是否已经满,不能插入元素*/ printf(顺序表已满,不能插入元素。n); return 0; else for(j=L-length;j=i;j-) /*将第i个位置以后的元素依次后移*/ L-listj=L-listj-1; L-listi-1=e; /*插入元素到第i个位置*/ L-length=L-length+1; /*将顺序表长增1*/ return 1; int DeleteList(SeqList *L,int i,DataType *e) int
8、 j; if(L-length=0) printf(顺序表已空不能进行删除!n); return 0; else if(iL-length) printf(删除位置不合适!n); return -1; else *e=L-listi-1; for(j=i;jlength-1;j+) L-listj-1=L-listj; L-length=L-length-1; return 1; int ListLength(SeqList L) return L.length;void ClearList(SeqList *L) L-length=0;例二:#include /*包含输入输出头文件*/#de
9、fine ListSize 100typedef int DataType;typedef struct DataType listListSize; int length;SeqList;#includeSeqList.h /*包含顺序表实现文件*/void MergeList(SeqList A,SeqList B,SeqList *C); /*合并顺序表A和B中元素的函数声明*/void main() int i,flag; DataType a=6,11,11,23; DataType b=2,10,12,12,21; DataType e; SeqList A,B,C; /*声明顺序
10、表A,B和C*/ InitList(&A); /*初始化顺序表A*/ InitList(&B); /*初始化顺序表B*/ InitList(&C); /*初始化顺序表C*/ for(i=1;i=sizeof(a)/sizeof(a0);i+) /*将数组a中的元素插入到顺序表A中*/ if(InsertList(&A,i,ai-1)=0) printf(位置不合法); return; for(i=1;i=sizeof(b)/sizeof(b0);i+) /*将数组b中元素插入到顺序表B中*/ if(InsertList(&B,i,bi-1)=0) printf(位置不合法); return;
11、printf(顺序表A中的元素:n); for(i=1;i=A.length;i+) /*输出顺序表A中的每个元素*/ flag=GetElem(A,i,&e); /*返回顺序表A中的每个元素到e中*/ if(flag=1) printf(%4d,e); printf(n); printf(顺序表B中的元素:n); for(i=1;i=B.length;i+) /*输出顺序表B中的每个元素*/ flag=GetElem(B,i,&e); /*返回顺序表B中的每个元素到e中*/ if(flag=1) printf(%4d,e); printf(n); printf(将在A中出现B的元素合并后C中
12、的元素:n); MergeList(A,B,&C); /*将在顺序表A和B中的元素合并*/ for(i=1;i=C.length;i+) /*显示输出合并后C中所有元素*/ flag=GetElem(C,i,&e); if(flag=1) printf(%4d,e); printf(n); void MergeList(SeqList A,SeqList B,SeqList *C)/*合并顺序表A和B的元素到C中,并保持元素非递减排序*/ int i,j,k; DataType e1,e2; i=1;j=1;k=1; while(i=A.length&j=B.length) GetElem(A
13、,i,&e1); /*取出顺序表A中的元素*/ GetElem(B,j,&e2); /*取出顺序表B中的元素*/ if(e1=e2) /*比较顺序表A和顺序表B中的元素*/ InsertList(C,k,e1); /*将较小的一个插入到C中*/ i+; /*往后移动一个位置,准备比较下一个元素*/ k+; else InsertList(C,k,e2); /*将较小的一个插入到C中*/ j+; /*往后移动一个位置,准备比较下一个元素*/ k+; while(i=A.length) /*如果A中元素还有剩余,这时B中已经没有元素*/ GetElem(A,i,&e1); InsertList(C
14、,k,e1); /*将A中剩余元素插入到C中*/ i+; k+; while(jlength=A.length+B.length; /*C的表长等于A和B的表长的和*/重点2:void InitList(LinkList *head)/*将单链表初始化为空。动态生成一个头结点,并将头结点的指针域置为空。*/ if(*head=(LinkList)malloc(sizeof(ListNode)=NULL) /*为头结点分配一个存储空间*/ exit(-1); (*head)-next=NULL; /*将单链表的头结点指针域置为空*/int ListEmpty(LinkList head) /*判
15、断单链表是否为空,就是通过判断头结点的指针域是否为空*/ if(head-next=NULL) /*判断单链表头结点的指针域是否为空*/ return 1; /*当单链表为空时,返回1;否则返回0*/ else return 0;ListNode *Get(LinkList head,int i) /*查找单链表中第i个结点。查找成功返回该结点的指针表示成功;否则返回NULL表示失败。*/ ListNode *p; int j; if(ListEmpty(head) /*在查找第i个元素之前,判断链表是否为空*/ return NULL; if(inext!=NULL&jnext; j+; i
16、f(j=i) return p; /*找到第i个结点,返回指针p*/ else return NULL; /*如果没有找到第i个元素,返回NULL*/ListNode *LocateElem(LinkList head,DataType e) /*查找线性表中元素值为e的元素,查找成功将对应元素的结点指针返回,否则返回NULL表示失败。*/ ListNode *p; p=head-next; /*指针p指向第一个结点*/ while(p) if(p-data!=e) /*找到与e相等的元素,返回该序号*/ p=p-next; else break; return p;int LocatePos
17、(LinkList head,DataType e) /*查找线性表中元素值为e的元素,查找成功将对应元素的序号返回,否则返回0表示失败。*/ ListNode *p; int i; if(ListEmpty(head) /*在查找第i个元素之前,判断链表是否为空*/ return 0; p=head-next; /*指针p指向第一个结点*/ i=1; while(p) if(p-data=e) /*找到与e相等的元素,返回该序号*/ return i; else p=p-next; i+; if(!p) /*如果没有找到与e相等的元素,返回0,表示失败*/ return 0;int Inse
18、rtList(LinkList head,int i,DataType e)/*在单链表中第i个位置插入一个结点,结点的元素值为e。插入成功返回1,失败返回0*/ ListNode *p,*pre; /*定义指向第i个元素的前驱结点指针pre,指针p指向新生成的结点*/ int j; pre=head; /*指针p指向头结点*/ j=0; while(pre-next!=NULL&jnext; j+; if(!pre) /*如果没找到,说明插入位置错误*/ printf(插入位置错); return 0; /*新生成一个结点,并将e赋值给该结点的数据域*/ if(p=(ListNode*)ma
19、lloc(sizeof(ListNode)=NULL) exit(-1); p-data=e; /*插入结点操作*/ p-next=pre-next; pre-next=p; return 1;int DeleteList(LinkList head,int i,DataType *e)/*删除单链表中的第i个位置的结点。删除成功返回1,失败返回0*/ ListNode *pre,*p; int j; pre=head; j=0; while(pre-next!=NULL&pre-next-next!=NULL&jnext; j+; if(j!=i-1) /*如果没找到要删除的结点位置,说明删
20、除位置错误*/ printf(删除位置错误); return 0; /*指针p指向单链表中的第i个结点,并将该结点的数据域值赋值给e*/ p=pre-next; *e=p-data;/*将前驱结点的指针域指向要删除结点的下一个结点,也就是将p指向的结点与单链表断开*/ pre-next=p-next; free(p); /*释放p指向的结点*/ return 1;int ListLength(LinkList head) ListNode *p; int count=0; p=head; while(p-next!=NULL) p=p-next; count+; return count;vo
21、id DestroyList(LinkList head) ListNode *p,*q; p=head; while(p!=NULL) q=p; p=p-next; free(q); 例三:/*包含头文件*/#include #include#include /*宏定义和单链表类型定义*/#define ListSize 100typedef int DataType;typedef struct Node DataType data; struct Node *next;ListNode,*LinkList;#includeLinkList.h /*包含单链表实现文件*/void DelE
22、lem(LinkList A,LinkList B); /*删除A中出现B的元素的函数声明*/void DelElem2(LinkList A,LinkList B);void main() int i; DataType a=2,3,6,7,9,14,56,45,65,67; DataType b=3,4,7,11,34,54,45,67; LinkList A,B; /*声明单链表A和B*/ ListNode *p; InitList(&A); /*初始化单链表A*/ InitList(&B); /*初始化单链表B*/ for(i=1;i=sizeof(a)/sizeof(a0);i+)
23、/*将数组a中元素插入到单链表A中*/ if(InsertList(A,i,ai-1)=0) printf(位置不合法); return; for(i=1;i=sizeof(b)/sizeof(b0);i+) /*将数组b中元素插入单链表B中*/ if(InsertList(B,i,bi-1)=0) printf(位置不合法); return; printf(单链表A中的元素有%d个:n,ListLength(A); for(i=1;idata); /*输出单链表A中的每个元素*/ printf(n); printf(单链表B中的元素有%d个:n,ListLength(B); for(i=1;
24、idata); /*输出单链表B中的每个元素*/ printf(n); DelElem2(A,B); /*将在单链表A中出现的B的元素删除,即A-B*/ printf(将在A中出现B的元素删除后(A-B),现在A中的元素还有%d个:n,ListLength(A); for(i=1;idata); /*显示输出删除后A中所有元素*/ printf(n); void DelElem(LinkList A,LinkList B)/*删除A中出现B的元素的函数实现*/ int i,pos; DataType e; ListNode *p; /*在单链表B中,取出每个元素与单链表A中的元素比较,如果相等则删除A中元素对应的结点*/ for(i=1;idata); /*比较B中的元素是否与A中的元素相等*/ if(pos0) DeleteList(A,pos,&e); /*如果相等,将其从A中删除*/ void De
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1