利用头插法实现单链表,并实现插入,删除,倒置的功能
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include <windows.h>
typedef struct LNode
{
int data;
struct LNode *next;
}*LinkList;
int num;
void Build(LinkList &head,int n)
{
int temp;
LinkList p,q;
head= (LinkList)malloc(sizeof(LinkList));
head->next = NULL;
for (int i = 0; i < n; i++)
{
p = (LinkList)malloc(sizeof(LinkList));
printf("请输入第%d个值",i+1);
scanf("%d", &p->data);
p->next = head->next;
head->next = p;
}
//排序
/*
q = (LinkList)malloc(sizeof(LinkList));
for (int i = 0; i < n - 1; i++)
{
q = head->next;
for (int j = 0; j < n - i - 1; j++)
{
if (q->data > q->next->data)
{
temp = q->data;
q->data = q->next->data;
q->next->data = temp;
}
q = q->next;
}
}*/
}
void Insert(LinkList &head,int n)
{
LinkList p,_new;
p = (LinkList)malloc(sizeof(LinkList));
_new=(LinkList)malloc(sizeof(LinkList));
p = head;
while (p->next != NULL)
{
if (n < p->next->data)
break;
p = p->next;
}
_new->next = p->next;
p->next=_new;
_new->data = n;
num++;
}
void Delet(LinkList &head,int n,int k)
{
while (1)
{
if (k > n)
{
printf("数据超出元素个数,请重新输入:\n");
scanf("%d", &k);
}
else
break;
}
int j = 0;
LinkList p,q;
p = (LinkList)malloc(sizeof(LinkList));
p = head;
while (p != NULL&&j<k-1)
{
j++;
p = p->next;
}
p->next = p->next->next;
num--;
}
void Inversion(LinkList &head,int n)
{
int m = n;
int temp;
LinkList p;
p = (LinkList)malloc(sizeof(LinkList));
for (int i = 0; i < n-1; i++)
{
p = head->next;
for (int j = 0; j < m-1; j++)
{
temp = p->data;
p->data = p->next->data;
p->next->data = temp;
p = p->next;
}
m--;
}
}
int Max(LinkList &head)
{
int maxnum;
LinkList p;
p = (LinkList)malloc(sizeof(LinkList));
p = head->next;
if (p == NULL)
{
printf("表为空,程序将退出\n");
Sleep(5000);
}
else
maxnum = p->data;
while (p->next != NULL)
{
if (p->data < p->next->data)
maxnum=p->next->data;
p = p->next;
}
return maxnum;
}
void print(LinkList &head)
{
LinkList p;
p = (LinkList)malloc(sizeof(LinkList));
p = head->next;
while (p != NULL)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
/*int Merge()
{
int geshu;
printf("请输入第二个链表的数据个数");
scanf("%lf", &geshu);
Build(geshu);
print();
LinkList *p;
p = (LinkList*)malloc(sizeof(LinkList));
p = xin->next;
while (p != NULL)
{
}
return 0;
}*/
int main()
{
LinkList L;
L = (LinkList)malloc(sizeof(LinkList));
int m,i;
printf("请输入数据的个数:");
scanf("%d", &num);
Build(L,num);
print(L);
//插入函数
printf("请输入要插入的数据");
scanf("%d", &m);
Insert(L,m);
printf("插入成功\n");
print(L);
//删除函数
printf("请输入要删除第几个元素:");
scanf("%d", &i);
Delet(L,num,i);
printf("删除成功!\n");
print(L);
//倒置链表
printf("倒置成功\n");
Inversion(L,num);
print(L);
//最大值
printf("最大值为:%d",Max(L));
//合并
//Merge();
system("pause");
}