数据结构,链表,冒泡排序,插入排序算法

        下方采取了两种排序算法,冒泡(short1)与插入排序(Short2),特别需要注意的是,排序算法的操作的是phead本身地址,而冒泡排序只是简单的数据(data)交换,而且此处虽然创建了头节点函数creat(),但是在进行数值插入时,会把头节点覆盖,所以本质上是没有头节点的(头节点只有指针指向,无数据)。

#include
#include
typedef struct Node {
    int data;
    struct Node* next;
} linklist;
linklist*creat()
{
    linklist*p=(linklist*)malloc(sizeof(linklist));
    if(p==NULL) return NULL;
    p->data=-1;
    p->next=NULL;
    return p;
}

int len_list(linklist* head)
{
    if(head==NULL) return 0;
    int num=0;
    while (head!=NULL)
    {
        num++;
        head=head->next;
    }
    return num;
}
int sort1(linklist *head)
{
     if(head==NULL) return -2;
    if(head->next==NULL) return -1;
    linklist *pt1=head;
    int k=len_list(head);
    for (int i = 0; i < k-1; i++)
    {
        head=pt1;
        for (int j = 0; j data)>(head->next->data))
            { 
               int pt=head->data;
               head->data=head->next->data;
               head->next->data=pt;
            }
            head=head->next;
        }
    }
   return 0;
}

void Sort2(linklist** head) {//无头节点,即第一个节点有数据。
    if (*head == NULL || (*head)->next == NULL) 
        return;  // 如果链表为空或只有一个元素则直接返回
    linklist* sort = NULL;  // 创建一个新链表用于存储排序后的结果
    linklist* h = *head;
    while (h != NULL) {
        linklist* next = h->next;
        // 插入当前节点到sort链表中的正确位置
        if (sort == NULL || sort->data >= h->data) {
            h->next = sort;
            sort = h;
        } else {
            linklist* temp = sort;
            while (temp->next != NULL && temp->next->data < h->data) {
                temp = temp->next;
            }
            h->next = temp->next;
            temp->next = h;
        }
        h=next;
    }
   *head = sort;  // 更新原链表的头指针
}
//插入头插入
int insart_linklist(linklist**head,int val)
{
    linklist* new=(linklist*)malloc(sizeof(linklist));
    struct Node* pt1 = *head;
    if (new!=NULL)
    {
     new->data=val;
     new->next=NULL;
		//链接
		if (NULL==*head||pt1->data==-1)//清空后可以再次插入,pt1->data==-1代表头节点head的data值没有被赋值,但是我们这个是无空值头节点。
		{
			*head=new;
		}
		else
		{

			struct Node* pt = *head;
			while (pt->next!=NULL)//找尾节点
			{
				pt = pt->next;
			}
			pt->next = new;
           
		}
    }
    return 0;
}

int out(linklist*head)
{
    if(head==NULL) return -1;
    while(head->next!=NULL)
    {
       printf("%d ",head->data);
       head=head->next;
    }
    printf("%d ",head->data);
   return 0;
}
int main()
{
    linklist*phead=creat();
    insart_linklist(&phead,3);
    insart_linklist(&phead,6);
    insart_linklist(&phead,1);
    insart_linklist(&phead,5);
    insart_linklist(&phead,4);
    insart_linklist(&phead,2);
    insart_linklist(&phead,7);
    insart_linklist(&phead,0);
    // sort1(phead);
    Sort2(&phead);
    out(phead);
    return 0;
}

你可能感兴趣的:(数据结构,链表,冒泡,插入排序)