数据结构——单链表(实现链表的排序)


前言

提示:这里可以添加本文要记录的大概内容:
实现链表的排序(使链表中元素的从无序到有序,要求从小到大)例如(1,6,8,3,7)(1,3,6,7,8)
实现链表的反转 例如(1,2,3,4,5,6)(6,5,4,3,2,1)
链表求相邻两个结点最大值

实现链表的排序(使链表中元素的从无序到有序,要求从小到大)例如(1,6,8,3,7)(1,3,6,7,8)

代码如下(示例):

 int list_sort(linklist H){
     linklist p,q,r;

     if (H == NULL){
         printf("H is NULL\n");
         return -1;
     }

     if (H->next == NULL)
         return 0;
     p = H->next;
     q = H->next->next;
     r = H;
     H->next = NULL;
     p->next = H->next;
     H->next = p;
     while(q){
         p = q;
         q = q->next;
         r = H;                                                                  
         while (r->next){
             if (r->next->data < p->data){
                 r = r->next;
             }else{
                 break;
             }
         }
             p->next = r->next;
             r->next = p;
     }
     return 0;
 }

int main(int argc, const char *argv[])
 {
     linklist H;                                                                 
     int a[] = {16837};
     int i;

     H = list_create();  //建立新链表                    
     if (H == NULL)
         return -1;

     for (i = 0;i < sizeof(a)/sizeof(int);i++){
        list_tail_insert(H,a[i]);    //建立新节点、尾部插入                         
     }
     list_show(H);  //遍历链表                                        

     list_sort(H);//排序                                         
     list_show(H);

     list_free(H);

     return 0;
 }

实现链表的反转 例如(1,2,3,4,5,6)(6,5,4,3,2,1)

代码如下(示例):

int list_reverse(linklist H) {
    linklist p;
    linklist q;
 
    if (H == NULL) {
        printf("H is NULL\n");
        return -1;
    }
 
    if (H->next == NULL || H->next->next == NULL) {
        return 0;
    }
 
    p = H->next->next;
    H->next->next = NULL;
 
    while (p != NULL) {
        q = p;
        p = p->next;
 
        q->next = H->next;
        H->next = q;
    }
 
    return 0;
}

链表求相邻两个结点最大值

代码如下(示例):

linklist list_adjmax(linklist H, data_t *value) {
    linklist p, q, r;
    data_t sum;
 
    if (H == NULL){
        printf("H is NULL\n");
        return NULL;
    }
 
    if (H->next == NULL || H->next->next == NULL || H->next->next->next == NULL) {
        return H;
    }
 
    q = H->next;
    p = H->next->next;//p = q->next;
    r = q;
    sum = q->data + p->data;
 
    while (p->next != NULL) {
        p = p->next;
        q = q->next;
        if (sum < q->data + p->data) {
            sum = q->data + p->data;
            r = q;
        }
    }
 
    *value = sum;
 
    return r;
}

有序链表合并

代码如下(示例):

int list_merge(linklist H1, linklist H2) {
    linklist p, q, r;
 
    if (H1 == NULL || H2 == NULL) {
        printf("H1 || H2 is NULL\n");
        return -1;
    }
 
    p = H1->next;
    q = H2->next;
    r = H1;
    H1->next = NULL;
    H2->next = NULL;
 
    while (p && q) {
        if (p->data <= q->data) {
            r->next = p;
            p = p->next;
            r = r->next;
            r->next = NULL;
        } else {
            r ->next = q;
            q = q->next;
            r = r->next;
            r->next = NULL;
        }
    }
 
    if (p == NULL) {
        r->next = q;
    }else {
        r->next = p;
    }
 
    return 0;
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是C语言单链表的冒泡排序和查找的实现方法: 1. 单链表的冒泡排序 冒泡排序是一种简单的排序算法,它重复地遍历要排序的元素,比较相邻的两个元素大小,并根据大小交换位置,直到没有任何一对数字需要比较为止。在单链表中,需要交换节点的指针而不是节点的数据。 ``` void bubble_sort(struct node *head) { struct node *p, *q, *end = NULL; while (head != end) { p = head; while (p->next != end) { q = p->next; if (p->data > q->data) { int tmp = p->data; p->data = q->data; q->data = tmp; } p = p->next; } end = p; } } ``` 上面的代码中,`head` 是链表的头指针,`end` 是排序的结束位置。每次排序结束后,`end` 移动到上一次排序中最后一个节点的位置。内循环中的 `p` 指向当前节点,`q` 指向它后面的节点。如果 `p` 的数据大于 `q` 的数据,交换它们的值。 2. 单链表的查找 单链表的查找和数组的查找类似,也是遍历整个链表,依次比较每个节点的值和目标值是否相等。如果找到了相等的节点,返回该节点的指针,否则返回 NULL。 ``` struct node *search(struct node *head, int value) { struct node *p = head; while (p != NULL) { if (p->data == value) { return p; } p = p->next; } return NULL; } ``` 上面的代码中,`head` 是链表的头指针,`value` 是要查找的值。每次循环中,`p` 指向当前节点,如果当前节点的值等于目标值,返回该节点的指针。如果遍历完整个链表都没有找到相等的节点,返回 NULL。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值