南邮数据结构实验1.4:带表头结点单链表的非递减排序

题目:以实验 1.2 的带表头结点单链表为存储结构,编写程序实现单链表的非递减排序。

部分代码:

带表头结点单链表的非递减排序函数:

本来想用冒泡排序的,但是没成功,此部分程序参考了这里:https://bbs.csdn.net/topics/390668062

//简单选择排序:每次选择min的排到前面
Status Order(HeaderList *h){
    Node *s1,*s2,*s3,*s4,*p,*q;
    for (p=h->head;p!=NULL && p->link!=NULL;p=p->link) {     // p从指向头结点开始
        for (q=p->link;q!=NULL && q->link!=NULL;q=q->link) {
            if (p->link->element > q->link->element) {       // 如果当前结点元素值大于后面元素值,则交换
                s1=p->link;                                  // s1指向p后面的结点
                s2=p->link->link;                            // s2指向p后面的后面的结点
                s3=q->link;                                  // s2指向q后面的结点
                s4=q->link->link;                            // s4指向q后面的后面结点
 
                if (s2!=s3) {                                //如果s2不等于s3,说明交换两个结点的中间有一些其他结点数据
                    p->link=s3;
                    s3->link=s2;
                    q->link=s1;
                    s1->link=s4;
                }
                else {                                       // s2和s3指向同一个结点
                    p->link=s3;
                    s3->link=s1;
                    q=s3;
                    s1->link=s4;
                }
            }
        }
    }
    return OK;
}

完整程序:

#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef int Status;
#define ERROR 0
#define OK 1

typedef struct Node {
	ElemType element;      //结点的数据域
	struct Node * link;    //结点的指针域
}Node;

typedef struct {
	struct Node* head;     //表头结点
	int n;
}HeaderList;


//带表头结点单链表的初始化
Status Init(HeaderList *h) {
    h->head=(Node*)malloc(sizeof(Node));   //生成表头结点
    if(!h->head){
        return ERROR;
    }
	h->head->link = NULL;                  //设置单链表为空表
	h->n = 0;
	return OK;
}


//带表头结点单链表的查找
Status Find(HeaderList *h,int i,ElemType *x){
    Node *p;
    int j;
    if(i<0||i>h->n-1){
        return ERROR;
    }
    p=h->head->link;
    for(j=0;j<i;j++){
        p=p->link;
    }
    *x=p->element;
    return OK;
}


//带表头结点单链表的插入
Status Insert(HeaderList *h, int i, ElemType x) {
	Node *p, *q;
	int j;
	if (i<-1 || i>h->n - 1)
		return ERROR;
	p = h->head;                          //从头结点开始找ai元素所在的结点p
	for (j = 0; j <= i; j++) {
		p = p->link;
	}
	q = (Node*)malloc(sizeof(Node));      //生成新结点q
	q->element = x;
	q->link = p->link;                    //新结点q插在p之后
	p->link = q;
	h->n++;
	return OK;
}


//带表头结点单链表的删除
Status Delete(HeaderList *h,int i){
    int j;
    Node *p,*q;
    if(!h->n){
        return ERROR;
        if(i<0||i>h->n-1){
            return ERROR;
        }
    }
    q=h->head;
    for(j=0;j<i;j++){
        q=q->link;
    }
    p=q->link;
    q->link=p->link;                //从单链表中删除p所指结点
    free(p);                        //释放p所指结点的存储空间
    h->n--;
    return OK;
}


//带表头结点单链表的输出
Status Output(HeaderList *h) {
	Node *p;
	if (!h->n)
		return ERROR;
	p = h->head->link;
	while (p) {
		printf("%d ",p->element);
		p = p->link;
	}
	return OK;
}


//带表头结点单链表的撤销
void Destroy(HeaderList *h){
    Node *p,*q;
    while(h->head->link){
        q=h->head->link;
        p=h->head->link->link;
        free(h->head->link);
        h->head=q;
    }
}


//简单选择排序:每次选择min的排到前面
Status Order(HeaderList *h){
    Node *s1,*s2,*s3,*s4,*p,*q;
    for (p=h->head;p!=NULL && p->link!=NULL;p=p->link) {     // p从指向头结点开始
        for (q=p->link;q!=NULL && q->link!=NULL;q=q->link) {
            if (p->link->element > q->link->element) {       // 如果当前结点元素值大于后面元素值,则交换
                s1=p->link;                                  // s1指向p后面的结点
                s2=p->link->link;                            // s2指向p后面的后面的结点
                s3=q->link;                                  // s2指向q后面的结点
                s4=q->link->link;                            // s4指向q后面的后面结点
 
                if (s2!=s3) {                                //如果s2不等于s3,说明交换两个结点的中间有一些其他结点数据
                    p->link=s3;
                    s3->link=s2;
                    q->link=s1;
                    s1->link=s4;
                }
                else {                                       // s2和s3指向同一个结点
                    p->link=s3;
                    s3->link=s1;
                    q=s3;
                    s1->link=s4;
                }
            }
        }
    }
    return OK;
}



void main()
{
	int i,j, x;
	HeaderList list;
	Init(&list);
	for (i = 8,j = 0; i >= 0; i--,j ++) {
		Insert(&list, j - 1, i);    //插入8~0
	}
    printf("the linklist is:");
	Output(&list);
    Order(&list);                   //非递减排序
    printf("\nthe linklist is:");
    Output(&list);
    Destroy(&list);
}

实验结果:

版权声明:本文为博主原创文章,未经博主允许不得转载。

好的,以下是带表头结点单链表的建立、清空、插入、删除、查找、修改、逆置和排序运算C语言实现代码: ``` #include <stdio.h> #include <stdlib.h> // 定义链表结构体 typedef struct Node { int data; struct Node *next; } Node, *LinkedList; // 创建链表 LinkedList createList() { LinkedList head = (LinkedList)malloc(sizeof(Node)); head->next = NULL; return head; } // 清空链表 void clearList(LinkedList head) { Node *p = head->next; while (p != NULL) { Node *temp = p->next; free(p); p = temp; } head->next = NULL; } // 插入节点 void insertNode(LinkedList head, int data, int index) { Node *p = head; int i = 0; while (p != NULL && i < index) { p = p->next; i++; } if (p == NULL || i > index) { printf("插入位置不合法\n"); return; } Node *newNode = (Node*)malloc(sizeof(Node)); newNode->data = data; newNode->next = p->next; p->next = newNode; } // 删除节点 void deleteNode(LinkedList head, int index) { Node *p = head; int i = 0; while (p->next != NULL && i < index) { p = p->next; i++; } if (p->next == NULL || i > index) { printf("删除位置不合法\n"); return; } Node *temp = p->next; p->next = temp->next; free(temp); } // 查找节点 int findNode(LinkedList head, int data) { Node *p = head->next; int i = 0; while (p != NULL) { if (p->data == data) { return i; } p = p->next; i++; } return -1; } // 修改节点 void modifyNode(LinkedList head, int data, int index) { Node *p = head->next; int i = 0; while (p != NULL && i < index) { p = p->next; i++; } if (p == NULL || i > index) { printf("修改位置不合法\n"); return; } p->data = data; } // 链表逆置 void reverseList(LinkedList head) { Node *p = head->next; Node *pre = NULL; while (p != NULL) { Node *temp = p->next; p->next = pre; pre = p; p = temp; } head->next = pre; } // 链表排序 void sortList(LinkedList head) { Node *p = head->next; int len = 0; while (p != NULL) { len++; p = p->next; } for (int i = 0; i < len - 1; i++) { p = head->next; for (int j = 0; j < len - i - 1; j++) { if (p->data > p->next->data) { int temp = p->data; p->data = p->next->data; p->next->data = temp; } p = p->next; } } } // 打印链表 void printList(LinkedList head) { Node *p = head->next; while (p != NULL) { printf("%d ", p->data); p = p->next; } printf("\n"); } int main() { LinkedList list = createList(); insertNode(list, 1, 0); insertNode(list, 2, 1); insertNode(list, 3, 2); insertNode(list, 4, 3); printf("原始链表:"); printList(list); deleteNode(list, 2); printf("删除节点后的链表:"); printList(list); modifyNode(list, 5, 1); printf("修改节点后的链表:"); printList(list); reverseList(list); printf("逆置后的链表:"); printList(list); sortList(list); printf("排序后的链表:"); printList(list); clearList(list); printf("清空后的链表:"); printList(list); return 0; } ``` 希望这个代码能够帮到你。
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wonz

创作不易,一块就行。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值