关于本篇文章说明
对于代码块中出现的函数的作用会在标题下说明,函数体中出现的指针(除head头指针外)
皆为中间指针变量。
代码中出现了一些c的函数printf,但只有printf函数,其余全为c++中函数,请放心阅读。
代码并没有使用类的包装,类的包装会在作者开学后再进行添加。
最后,可以设置头指针指向的单元值为单链表长度,但本文并没有这样设置,而是设置了全局变量。
单链表的结构单元
其中num为单元携带的数值,next指针则指向下一个单元。
typedef struct node
{
int num;
struct node* next;
}Student;
单链表的创建(头插法和尾插法)
创建单链表,并将其相连接,最后返回头指针(头指针是开启单链表大门的钥匙)
头插法
Student* createList_1()
{
cout << "请输入链表长度:";
cin >> len;
Student* head =new Student;
head->next = NULL;
for (int i = 0; i < len; i++)
{
Student* p = new Student;
printf("请输入第%d个节点的数值:",len- i - 1);
cin >> p->num;
p->next = head->next;
head->next = p;
}
return head;
}
尾插法
Student* createList_2()
{
Student* head = new Student;
head->next = NULL;
Student* r = head;
cout << "请输入链表长度:";
cin >> len;
for (int i = 0; i < len; i++)
{
Student* p = new Student;
printf("请输入第%d个节点的数值:", i + 1);
cin >> p->num;
r->next = p;
r = p;
}
return head;
}
单链表的输出
oid display(Student* head)
{
Student* p=head->next;
cout << endl;
for (int i = 0; i < len; i++)
{
if (i != 0)
cout << " --> ";
cout << p->num ;
p = p->next;
}
}
单链表删除某一结点
void delet_point(Student* head)
{
int n;
Student* p = head, * r = head;
printf("\n请输入想要删除的节点数:");
cin >> n;
while (n<=0 || n>len + 1)
{
printf("\n输入错误,请重新输入(%d,%d):", 1, len + 1);
cin >> n;
}
for (int i = 0; i < n; i++)
{
p = p->next;
if (i < n - 1)
r = r->next;
}
r->next = p->next;
delete p;
len--;
}
单链表删除某一数值
void delet_num(Student* head)
{
int num, a = 1;
Student* p = head, * r = head;
printf("\n请输入想要删除的数值:");
cin >> num;
for (int i = 0; i < len; i++)
{
p = r->next;
if(p->num==num)
{
r->next = p->next;
delete p;
len--;
a = 0;
}
r = r->next;
}
if (a)
printf("\n该链表中不存在该数.\n");
}
单链表的插入
void input(Student* head)
{
int n;
Student* p = new Student;
Student* r = head;
printf("\n请输入新增节点数值:");
cin >> p->num;
printf("\n请输入新增节点位置(%d,%d):",1,len+1);
cin >> n;
while (n<=0 || n>len + 1)
{
printf("\n输入错误,请重新输入(%d,%d):", 1, len + 1);
cin >> n;
}
for (int i = 0; i < n-1; i++)
r = r->next;
p->next = r->next;
r->next = p;
len++;
}
单链表的取值
void absorb(Student* head)
{
int n;
printf("\n请输入想取值的节点数(%d,%d):",1,len);
cin >> n;
while (n <= 0 || n > len)
{
printf("\n输入错误,请重新输入(%d,%d):", 1, len);
cin >> n;
}
Student* p=head;
for (int i = 0; i < n; i++)
p = p->next;
printf("该值为:%d", p->num);
}
单链表逆转
void reverse(Student* head)
{
Student* p = head, * t = NULL, * r = p->next;
for (int i = 0;i<len; i++)
{
p = r;
r = r->next;
p->next = t;
t = p;
}
head->next = p;
}
单链表的选择排序
void sort(Student* head)
{
Student* r = head, * p = r, * t = r;
int tem = 0;
for(int i=0;i<len;i++)
{
t = r;
for (int j = i ; j < len; j++)
{
if (t->num> p->num)
t = p;
p = p->next;
}
tem = r->num;r->num = t->num;t->num = tem;
r = r->next;
p = r;
}
}
关于两个单链表的合并
两个单链表的有序合并要将两个链表合并后再进行排序,无序合并直接连接链表即可。