#include<iostream>
#include<vector>
using namespace std;
typedef struct student
{
int data;
//struct student *next;
student *next;
}node;
//单链表的建立(带头结点)
node* creat()
{
node *p, *s;
int x, cycle = 1;
node *head = new node();
//head->data = 1; //头结点默认值为0,当然这里也可以初始化其值
p = head;
while (cin>>x&&x!=0) //依次输入结点值,规定当输入为0时结束while循环
{
s = new node();
s->data = x;
p->next = s;
p = s;
}
return head;
}
//单链表的测长
int length(node *head)
{
int len=0;
node *p = head;
while (p!= NULL)
{
len++;
p = p->next;
}
return len;
}
//单链表的打印
void print(node *head)
{
node *p = head;
while (p != NULL)
{
cout << p->data << " ";
p = p->next;
}
cout << endl;
}
//单链表的删除
node *Del(node *head,int num)
{
node * p1, *p2;
p1 = head;
p2 = p1; //p2需要初始化
while (num!=p1->data&&p1->next!=NULL)
{
p2 = p1;
p1 = p1->next;
}
if (num == p1->data)
{
if (p1 == head)
{
head = p1->next; //删除头结点
delete p1;
}
else //删除中间结点
{
p2->next= p1->next;
delete p1;
}
}
else
{
cout << num << " not found" << endl;
}
return head;
}
//单链表的插入
node *Insert(node * head, int num)
{
node *p1,*p2;
node *p0 = new node(); //新建待插入结点
p0->data = num;
p1 = head;
p2 = p1;
while (p0->data > p1->data&&p1->next != NULL) //假设将待插入结点插在第一个比它小的结点后面
{
p2 = p1;
p1 = p1->next;
}
if (p0->data <= p1->data)
{
if (p1 == head) //插在头结点前面
{
p0->next = p1;
head = p0;
}
else //插入位置为中间结点
{
p2->next = p0;
p0->next = p1;
}
}
else //插在尾结点后面
{
p1->next = p0;
p0->next = NULL;
}
return head;
}
//单链表的排序
node *sortList(node *head)
{
int temp;
node *p1 = head;
int len = length(head);
if (head == NULL || head->next == NULL)
return head;
for (int i = 1; i < len; i++)
{
p1 = head;
for (int j = 0; j < len-i; j++)
{
if (p1->data > p1->next->data)
{
temp = p1->data;
p1->data = p1->next->data;
p1->next->data = temp;
}
p1 = p1->next;
}
}
return head;
}
//单链表的逆置
node *Reverse(node *head)
{
node *pNode = head;
node *pPre = NULL;
node *pReveseNode = NULL;
while (pNode != NULL)
{
node *pNext = pNode->next;
if (pNext == NULL)
pReveseNode = pNode;
pNode->next = pPre;
pPre = pNode;
pNode = pNext;
}
return pReveseNode;
}
int main()
{
//创建单链表
node *head=creat();
//单链表测长
int len = length(head);
//打印单链表
print(head);
//单链表删除指定结点
int num1;
cin >> num1;
node *head2=Del(head,num1);
print(head2);
//单链表插入结点
int num2;
cin >> num2;
node *head3 = Insert(head, num2);
print(head3);
//单链表的排序
node *head4 = sortList(head);
print(head4);
//逆置单链表
node *head5 = Reverse(head);
print(head5);
}
单链表的创建、测长、打印、插入、删除、排序及逆置
最新推荐文章于 2019-07-01 21:57:16 发布