线性表-链式存储结构(2)

1.编程实现单链表的建立/测长/打印

typedef struct student
{
    int data;
    struct student *next;
}node;

node *creat()
{
    node *head, *p, *s;
    int x, cycle = 1;
    head = (node *)malloc(sizeof(node));
    p = head; //p指向尾部的结点
    while (cycle)
    {
        printf("
 please input the data: ");
        scanf("%d", &x);
        if (x != 0)
        {
            s = (node *)malloc(sizeof(node));
            s->data = x;
            printf("
%d", s->data);
            p->next = s;
            p = s;
        }
        else cycle = 0;
    }
    head = head->next;
    p->next = NULL;
    return (head);
}

int length(node *head)
{
    node *p = head;
    int x = 0;
    while (p != NULL)
    {
        p = p->next;
        x++;
    }
    return x;
}

void print(node *head)
{
    node *p;int n;
    n = length(head);
    printf("
 Now ,these %d records are:
", n);
    p = head;
    if (head != NULL)
        while (p != NULL)
        {
            printf("
    %d", p->data);
            p = p->next;
        }
}

2.实现单链表的插入

node *insert(node *head, int num)
{
    node *p0, *p1, *p2 = NULL;
    p1 = head;
    p0 = (node *)malloc(sizeof(node));
    p0->data = num;
    while (p0->data > p1->data&&p1->next != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }
    if (p0->data <= p1->data)
    {
        if (head == p1) //头
        {
            p0->next = p1;
            head = p0;
        }
        else //中
        {
            p2->next = p0;
            p0->next = p1;
        }
    }
    else //尾
    {
        p1->next = p0;
        p0->next = NULL;
    }
    
    return (head);

}

3.实现单链表的删除

node *del(node **head, int num)
{
    node *p1 = NULL, *p2 = NULL;
    p1 = *head;
    while (num != p1->data&&p1->next != NULL)
    {
        p2 = p1;
        p1 = p1->next;
    }
    if (num == p1->data)
    {
        if (p1 == *head)
        {
            *head = p1->next;
            free(p1);
        }
        else
            p2->next = p1->next;
    }
    else printf("
 %d could not been found", num);
    return *head;

}

4.实现单链表排序

node *sort(node *head) //冒泡
{
    node *p;
    int n;int temp;
    n = length(head);
    if (head == NULL || head->next == NULL)return head;
    p = head;
    for (int j = 1;j < n;++j)
    {
        p = head;
        for (int i = 0;i < n - j;++i)
        {
            if (p->data > p->next->data)
            {
                temp = p->data;
                p->data = p->next->data;
                p->next->data = temp;
            }
            p = p->next;
        }
    }
    return head;
}

5.实现单链表的逆置

node *reverse(node *head)
{
    node *p1, *p2, *p3; //前驱指针 当前指针 缓存指针
    if (head == NULL || head->next == NULL) //没带头结点的空链表 和带头结点的空链表 判断是否为空
        return head;
    p1 = head, p2 = p1->next;
    while (p2)
    {
        p3 = p2->next;
        p2->next = p1;
        p1 = p2; //p1 p2后移
        p2 = p3;
    }
    head->next = NULL;
    head = p1;
    return head;
}
void main()
{
	node *head;
	int del_num, insert_num;
	head = creat();
	print(head);

	printf("
 please input the delete data:");
	scanf("%d", &del_num);
	head = del(&head, del_num);
	print(head);

	printf("
please input the insert data:");
	scanf("%d", &insert_num);
	head = insert(head, insert_num);
	print(head);

	system("pause");
}
原文地址:https://www.cnblogs.com/Yang-Xin-Yi/p/14646282.html