#include <stdio.h>
#include <stdlib.h>
typedef int data_t;
typedef struct LINKLIST{
data_t data;
struct LINKLIST *next;
}linklist;
void printf_list(linklist *head);
void linklist_insert_head(linklist **head, data_t arg);
void linklist_insert_tail(linklist **head, data_t arg);
void modify_data(linklist **head, data_t o_data, data_t n_data);
void linklist_insert_sort(linklist **head, data_t arg);
linklist *Reverse(linklist **header);
int main()
{
linklist *Head = NULL;
#if 0
linklist_insert_head(&Head, 90);
linklist_insert_head(&Head, 60);
linklist_insert_head(&Head, 10);
linklist_insert_head(&Head, 30);
linklist_insert_head(&Head, 70);
linklist_insert_head(&Head, 110);
linklist_insert_head(&Head, 20);
linklist_insert_head(&Head, 50);
linklist_insert_head(&Head, 80);
#endif
#if 0
linklist_insert_tail(&Head, 250);
linklist_insert_tail(&Head, 260);
linklist_insert_tail(&Head, 270);
printf_list(Head);
modify_data(&Head, 270, 280);
#endif
linklist_insert_sort(&Head, 270);
linklist_insert_sort(&Head, 1270);
linklist_insert_sort(&Head, 270);
linklist_insert_sort(&Head, 370);
linklist_insert_sort(&Head, 1170);
linklist_insert_sort(&Head, 670);
linklist_insert_sort(&Head, 270);
linklist_insert_sort(&Head, 70);
printf_list(Head);
Head = Reverse(&Head);
printf_list(Head);
return 0;
}
void linklist_insert_head(linklist **head, data_t arg)
{
linklist *temp = (linklist *)malloc(sizeof(linklist));
temp->data = arg;
temp->next = NULL;
//先判断一下链表中是否有数据
//如果没有数据,直接保存新插入结点的地址
if(*head == NULL)
{
*head = temp;
}
//如果有数据,按照头插法插入
else
{
temp->next = *head;
*head = temp;
}
}
void linklist_insert_tail(linklist **head, data_t arg)
{
linklist *temp = (linklist *)malloc(sizeof(linklist));
temp->data = arg;
temp->next = NULL;
if(*head == NULL)
{
*head = temp;
}
else
{
linklist *p = *head;
while(p->next != NULL)
{
p = p->next;
}
p->next = temp;
}
}
void modify_data(linklist **head, data_t o_data, data_t n_data)
{
linklist *p = *head;
while(p != NULL)
{
if(p->data == o_data)
{
p->data = n_data;
goto L1;
}
p = p->next;
}
printf("没有找到o_data\n");
L1:;
}
void linklist_insert_sort(linklist **head, data_t arg)
{
linklist *temp = (linklist *)malloc(sizeof(linklist));
temp->data = arg;
temp->next = NULL;
if(*head == NULL)
{
*head = temp;
}
else
{
if(temp->data < (*head)->data)
{
temp->next = *head;
*head = temp;
}
else
{
linklist *p = *head;
while(p->next != NULL && p->next->data < temp->data)
{
p = p->next;
}
//将p的后一个结点的地址保存在新插入结点的指针域中
temp->next = p->next;
//将新插入结点的地址保存在p结点的指针域中
p->next = temp;
}
}
}
void printf_list(linklist *head)
{
while(head != NULL)
{
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
linklist *Reverse(linklist **header)
{
if ((*header) == NULL || (*header)->next == NULL)
{
return (*header);
}
linklist *pre; //前一个
linklist * cur; //当前
linklist * temp;//临时变量
pre = (*header);
cur = (*header)->next;
pre->next = NULL;
while (cur != NULL)
{
temp = cur->next; //temp暂存
cur->next = pre; //cur指向后面实现逆序
pre = cur; //pre后移
cur = temp; //cur后移
}
return pre;
}
学习记录——c语言单向链表
最新推荐文章于 2024-08-28 09:50:23 发布