递减双向循环队列插入元素,并保持递减性

设有一个带头结点的、按元素值递减有序排列的双向循环链表,编写算法,插入一个元素并保持其有序性。
双向链表结点的类型定义如下:

typedef struct DuLNode{
	int data;
	struct DuLNode *prior;//指向前驱的指针
	struct DuLNode *next;//指向后继的指针
}DuLNode,*DuLinkList;

这是一道考研题中的算法题,今天整理出来分享一下:

typedef int Status;

Status InitDuLinkList(DuLinkList &L,int e){
    DuLinkList p,s;
    p=L->next;
    
    if(!(s=(DuLinkList)malloc(sizeof(DuLNode))))
        return ERROR;
    s->data = e;
    while(p!=L && e < p->data){
        p->prior->next = s;
        s->prior = p->prior;
        s->next = p;
        p->prior = s;
    }
    
    return OK;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是动态非递减有序顺序表的C语言实现,包括输入元素插入元素操作: ``` #include <stdio.h> #include <stdlib.h> #define MAX_SIZE 100 // 最大容量 typedef struct { int *data; // 数据指针 int length; // 当前长度 int capacity; // 最大容量 } SeqList; // 初始化顺序表 void InitList(SeqList *L) { L->data = (int*)malloc(MAX_SIZE * sizeof(int)); L->length = 0; L->capacity = MAX_SIZE; } // 插入元素 int Insert(SeqList *L, int x) { // 如果顺序表已满,无法插入 if (L->length == L->capacity) { printf("顺序表已满,无法插入元素。\n"); return 0; } // 如果顺序表为空,直接插入元素 if (L->length == 0) { L->data[0] = x; L->length++; return 1; } // 在有序顺序表中查找插入位置 int i; for (i = L->length - 1; i >= 0; i--) { if (L->data[i] <= x) { break; } } // 插入元素 int j; for (j = L->length - 1; j > i; j--) { L->data[j + 1] = L->data[j]; } L->data[i + 1] = x; L->length++; return 1; } // 输入元素 void Input(SeqList *L) { int x; printf("请输入元素(输入-1结束):\n"); while (1) { scanf("%d", &x); if (x == -1) { break; } Insert(L, x); } } // 输出顺序表 void Print(SeqList L) { int i; printf("当前顺序表元素为:"); for (i = 0; i < L.length; i++) { printf("%d ", L.data[i]); } printf("\n"); } int main() { SeqList L; InitList(&L); Input(&L); Print(L); return 0; } ``` 在插入元素的过程中,我们先查找插入位置,然后将插入位置后面的元素往后移动一个位置,最后将要插入元素插入插入位置之后。这样可以保证顺序表仍然是有序的。 注意,在初始化顺序表时,我们需要动态申请内存空间,因为顺序表的容量是可变的。在插入元素时,如果顺序表已满,则无法插入元素。在输入元素时,我们可以通过循环输入的方式逐个插入元素

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值