/*包含头文件*/ #include<stdio.h> #include<malloc.h> #include<stdlib.h> /*宏定义和单链表类型定义*/ #define ListSize 100 typedef int DataType; typedef struct Node { DataType data; struct Node *next; }ListNode,*LinkList; void MergeList(LinkList A,LinkList B,LinkList *C); /*将单链表A和B的元素合并到C中的函数声明*/ void InitList(LinkList *head) /*将单链表初始化为空。动态生成一个头结点,并将头结点的指 针域置为空。*/ { if((*head=(LinkList)malloc(sizeof(ListNode))) ==NULL) /*为头结点分配一个存储空间*/ exit(-1); (*head)->next=NULL; /*将单链表的头结点指针域置为空*/ } int ListEmpty(LinkList head) /*判断单链表是否为空,就是通过判断头结点的指针域是否为空 */ { 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(i<1) /*在查找第i个元 素之前,判断该序号是否合法*/ return NULL; j=0; p=head; while(p->next!=NULL&&j<i) { p=p->next; j++; } if(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(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 InsertList(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&&j<i-1)/*找到第i-1个结点 ,即第i个结点的前驱结点*/ { pre=pre->next; j++; } if(!pre) /*如果没找到,说明插入位置错误*/ { printf("插入位置错"); return 0; } /*新生成一个结点,并将e赋值给该结点的数据域*/ if((p=(ListNode*)malloc(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&&j<i-1)/*判断是否找到前驱结点*/ { pre=pre->next; j++; } if(j!=i-1) /*如果没找到要 删除的结点位置,说明删除位置错误*/ { 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; } void DestroyList(LinkList head) { ListNode *p,*q; p=head; while(p!=NULL) { q=p; p=p->next; free(q); } } void main() { int i; DataType a[]={6,7,9,14,37,45,65,67}; DataType b[]={3,7,11,34,45,89}; LinkList A,B,C; /*声明单链表A和B*/ ListNode *p; InitList(&A); /*初始化单链表A*/ InitList(&B); /*初始化单链表B*/ for(i=1;i<=sizeof(a)/sizeof(a[0]);i++) /*将数组a中元素插入到单链表A中*/ { if(InsertList(A,i,a[i-1])==0) { printf("位置不合法"); return; } } for(i=1;i<=sizeof(b)/sizeof(b[0]);i++) /*将数组b中元素插入单链表B中*/ { if(InsertList(B,i,b[i-1])==0) { printf("位置不合法"); return; } } printf("单链表A中的元素有%d个:\n",ListLength(A)); for(i=1;i<=ListLength(A);i++) /*输出单链表A中的每个元素*/ { p=Get(A,i); /*返回单链表A中的每个结点的指针*/ if(p) printf("%4d",p->data); /*输出单链表A中的每个元素*/ } printf("\n"); printf("单链表B中的元素有%d个:\n",ListLength(B)); for(i=1;i<=ListLength(B);i++) { p=Get(B,i); /*返回单链表B中的每个每个结点的指针*/ if(p) printf("%4d",p->data); /*输出单链表B中的每个元素*/ } printf("\n"); MergeList(A,B,&C); /*将单链表A和B中的元素合并到C中*/ printf("将单链表A和B的元素合并到C中后,C中的元素有%d个:\n",ListLength(C)); for(i=1;i<=ListLength(C);i++) { p=Get(C,i); /*返回单链表C中每个结点的指针*/ if(p) printf("%4d",p->data); /*显示输出C中所有元素*/ } printf("\n"); getch(); } void MergeList(LinkList A,LinkList B,LinkList *C) /*单链表A和B中的元素非递减排列,将单链表A和B中的元素合并到C中,C中的元素仍按照非递减排列*/ { ListNode *pa,*pb,*pc;/*定义指向单链表A,B,C的指针*/ pa=A->next; pb=B->next; *C=A; /*将单链表A的头结点作为C的头结点*/ (*C)->next=NULL; pc=*C; /*依次将链表A和B中较小的元素存入链表C中*/ while(pa&&pb) { if(pa->data<=pb->data) { pc->next=pa; /*如果A中的元素小于或等于B中的元素,将A中的元素的结点作为C的结点*/ pc=pa; pa=pa->next; } else { pc->next=pb; /*如果A中的元素大于B中的元素,将B中的元素的结点作为C的结点*/ pc=pb; pb=pb->next; } } pc->next=pa?pa:pb; /*将剩余的结点插入C中*/ free(B); /*释放B的头结点*/ }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-23 10:45:26