由于考试需要,复习一下单链表的各种常见操作,直接上代码+注释,需要的可以参考下哈~
Code:
#include<iostream>
using namespace std;
typedef struct student
{
int data;
struct student *next;
}node;
//创建单链表
node *create()
{
node *head, *p, *s;
int x;
head = (node *)malloc(sizeof(node)); //先创建一个头节点,便于头指针的操作。
p = head;
printf("\nInput the data (end with '0') : ");
while(1)
{
if(scanf("%d", &x) != EOF && x != 0)
{//如果输入数据合法,则再创建一个节点;否则跳出循环。
s = (node *)malloc(sizeof(node));
s->data = x;
p->next = s;
p = s;
}
else break;
}
head = head->next;
p->next = NULL;
return head;
}
//计算单链表长度
int length(node *head)
{
int n = 0;
while(head != NULL)
{
head = head->next;
n++;
}
return n;
}
//打印单链表
void print(node *head)
{
int n = length(head);
printf("Output the list (%d records~) : ", n);
while(head != NULL)
{
printf(head->next == NULL ? "%d\n" : "%d->", head->data);
head = head->next;
}
}
//删除单链表节点
node *del(node *head, int num)
{
node *p1, *p2;
if(head == NULL) return NULL;
p1 = head;
while(num != p1->data && p1->next != NULL)
{//若当前指针所存储的值与要删除的值不符,则向后遍历,直至相等或至最后一个节点。
p2 = p1;
p1 = p1->next;
}
if(num == p1->data)
{//如果链表中存在要删除的节点,则分两种情况:在头节点处或链表中。
if(head == p1) head = p1->next;
else p2->next = p1->next;
free(p1); //别忘了释放删除的节点哦~节约点~
}
else printf("There is no '%d' \n", num); //找不到要删除的值。
return head;
}
//插入单链表节点
node *insert(node *head, int num)
{
node *p1, *p2, *p3;
p2 = head;
p1 = (node *)malloc(sizeof(node)); //先将要插入的节点申请下~
p1->data = num;
//思路同删除节点操作
while(num > p2->data && p2->next != NULL)
{
p3 = p2;
p2 = p2->next;
}
if(num <= p2->data)
{
if(head == p2)
{
p1->next = p2;
head = p1;
}
else
{
p3->next = p1;
p1->next = p2;
}
}
else
{//此处要细心,别忘了可以在尾部插入节点。
p2->next = p1;
p1->next = NULL;
}
return head;
}
//单链表排序
node *sort(node *head)
{
node *p;
p = head;
int n, temp;
n = length(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;
}
}
printf("\nAfter sorting ~\n");
return head;
}
//单链表逆置
node *reverse(node *head)
{
node *p1, *p2, *p3;
p1 = head;
p2 = p1->next;
if(head == NULL || head->next == NULL) return head;
//逆置的思想:选出三个节点(第三个可能是NULL),操作前两个节点,使其逆置,而后按同样做法操作第二、三个节点和第四个节点~
while(p2 != NULL)
{
p3 = p2->next;
p2->next = p1;
p1 = p2;
p2 = p3;
}
head->next = NULL;
head = p1;
printf("\nAfter reversing ~\n");
return head;
}
int main()
{
node *head;
//创建单链表
head = create();
print(head);
//排序
head = sort(head);
print(head);
//删除单链表
int numD;
printf("\nInput the value you want to delete : ");
scanf("%d", &numD);
head = del(head, numD);
print(head);
//插入单链表
int numS;
printf("\nInput the value you want to insert : ");
scanf("%d", &numS);
head = insert(head, numS);
print(head);
//逆置
head = reverse(head);
print(head);
return 0;
}
运行示例:
Ps:仅供参考哈~