计一个算法,删除元素递增排列的顺序表或链表L中值大于mink且小于maxk的所有元素。
1条回答 默认 最新
qzjhjxj 2022-09-27 23:47关注供参考:
#include <stdio.h> #include <stdlib.h> #include <time.h> typedef int ElemType; typedef struct LNode { ElemType data; struct LNode* next; }LNode, * pLinkList; //创建带有头结点的空链表 pLinkList SetNullList_Link() { pLinkList head = (pLinkList)malloc(sizeof(LNode)); if (head != NULL) head->next = NULL; else printf("申请头节点空间失败!\n"); return head; } //产生一组随机数建立单链表并对单链表排序。 void CreatSortList(pLinkList L, int length) { LNode* p, * pre, * s; for (int i = 1; i <= length; i++) { p = (LNode*)malloc(sizeof(LNode)); p->data = rand() % 100 + 1; p->next = NULL; if (!L->next) {//第一个结点,直接链入链表 L L->next = p; } else { //第二个结点开始,排序后链入链表 L pre = L; while (pre->next != NULL && pre->next->data < p->data) { pre = pre->next; } p->next = pre->next; pre->next = p; } } } //将有序单链表L中属于区间(mink, maxk)的元素删除。 void IntervalList(pLinkList L, ElemType mink, ElemType maxk) { if (mink > maxk) maxk += mink, mink = maxk - mink, maxk = maxk - mink; LNode* pL = L->next, * pt = L, * tail = NULL; while (pL && pL->data <= mink){ pt = pL; pL = pL->next; } while (pL && pL->data < maxk){ tail = pL; pL = pL->next; } if (tail) {//(mink,maxk)区间在 L 链表数据区间内 tail = tail->next; pL = NULL; while (pt->next != tail){ pL = pt->next; pt->next = pL->next; free(pL); } } } void printList(pLinkList list) { pLinkList tmp = list->next; int i = 0; if (!tmp) { printf("NULL"); } else { while (tmp) { printf("%d ", tmp->data); tmp = tmp->next; } } printf("\n"); } int main() { srand((unsigned int)time(NULL)); ElemType mink, maxk; pLinkList L = NULL; L = SetNullList_Link(); CreatSortList(L, 10); printList(L); printf("请输入删除元素数据区间的左值:"); scanf("%d", &mink); printf("请输入删除元素数据区间的右值:"); scanf("%d", &maxk); IntervalList(L, mink, maxk); printList(L); return 0; }解决 无用评论 打赏 举报 编辑记录