数据结构中(单链表)

list.h

lish.h
#ifndef _list_h
#define _list_h
typedef int ElementType;
struct Node
{
    ElemnetType Element;
    struct Node *Next;
};
typedef struct Node* PtrToNode;
typedef PtrToNode list;
typedef PtrToNode Position;

list Create_Head_Node(void);//创建一个表头
Position Create_New_Node(ElementType Element);//创建一个节点
void Add_Node_tail(List L,ElementType Element);//在表的末尾插入节点
void Show_List(List L);//打印列表
void delete_value(List L,ElementType Element);//使用一个结构体指针实现
void delete_value1(List L,ElementType Element);//使用两个结构体指针实现
void Insert_valuePosition(List L,ElementType Element,int pos);//在指定位置插入节点,但是插入位置受表的长度的限制,最大可插入的位置为表的长度加一。

具体的.c源文件,后面会更新

List Create_Head_Node(void)
{
    Position P;
    P = (List)malloc(sizeof(List));
    if(NULL==P)
    {
        Printf(malloc error!);
        return NULL;
    }
    P->Next = NULL;
    P->Element = 0;
    return P;
}
/*create a new node */
Position Create_New_Node(ElementType Element)
{
    Position P;
    P = Create_Head_Node();
    P->Element = Element;
    return P;
}
/*add date from the tail of the list*/
void Add_Node_tail(List L,ElementType Element)
{
    Position P;
    P = L;
    Position q = Create_New_Node(Element);
    while(P->Next!=NULL)
        P = P->Next;
    P->Next = q;
    L->Element++;
}
/*print list in ordor*/
void Print_List(List L)
{
    Position P;
    P=L;
    while(P->Next!=NULL)
    {
        printf("%d ",P->Element);
        P = P->Next;
    }   
    printf("%d\n,P->Element);
}
/*delete the list node by value ,which can delete all the value of the list*/
void delete_value(List L,ElementType Element)
{
    Position P,tmp;
    P=L;
    while(P->Next!=NULL)
    {
        if((P->Next->Element)==Element)
        {
            tmp = P->Next->Next;
            free(P->Next);
            P->Next = tmp;
            continue;
        }
        P = P->Next;
    }
}
/*using two points to realize the function of delete*/
void delete_value1(List L,ElementType Element)
{
    Position P,tmp;
    tmp = L;
    P = tmp->Next;
    while(P!=NULL)
    {    
        if(P->Element == Element)    
        {
            tmp ->Next = P->Next;
            free(p);
            P = tmp ->Next;
            continue;
        }
    tmp = tmp->Next;
    P = P->Next;
    }
}

 

数据结构中,单链表的排序通常不是直接进行的,因为链表不像数组那样可以直接访问任意位置的元素。然而,考虑到单链表的特点,我们可以选择一些适应链式访问的排序算法,例如插入排序和冒泡排序。 对于插入排序,它是线性的,适合链表这种动态数据结构,因为它不需要移动元素,只需修改指针指向。以下是插入排序的一个简化版本,只适用于整数链表: ```c void insertion_sort_list(Node** head) { if (*head == NULL || (*head)->next == NULL) return; Node* current = *head; Node* sorted = *head; while (current != NULL) { Node* temp = sorted; // 比较并插入 while (temp->next != NULL && temp->next->data < current->data) { temp = temp->next; } // 插入当前节点 current->next = temp->next; temp->next = current; // 移动到下一个节点 current = current->next; } } ``` 冒泡排序虽然不适合链表,但在某些特殊条件下(如双向链表),也可以考虑。 对于更高效的排序,如归并排序或快速排序,它们在链表上需要额外的工作,通常是先将链表转换为数组,再排序,最后转回链表。这会增加空间复杂度。 至于排序后的链表状态,你可以通过一个辅助函数来检查或描述,例如检查所有节点是否连续递增: ```c bool is_sorted(Node* head) { Node* prev = NULL; while (head != NULL) { if (prev != NULL && head->data < prev->data) return false; prev = head; head = head->next; } return true; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值