链表功能
可操作有:
1.初始化或重置链表
2.销毁链表
3.链表中数据元素个数
4.所指位序的元素值
5.链表已存在元素
6.请输入元素,求直接前驱
7.请输入元素,求直接后驱
8.在第i个位置插入元素
9.删除第i个元素
10.输出所输入的链表元素
11.初始化并输入链表
12.退出
13.清空链表
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
typedef struct Sqlist{
int Data;//node数据
struct Sqlist *next;//下一个node地址
}Sqlist;
static int sum=0,i=0;//sum为链表长度,i方便循环查找
bool decide=false;//来判断是否初始化
void Display();//主屏幕显示
Sqlist *Start_restart();//初始化或重置
void Delet(Sqlist *head);//销毁链表
void Add(Sqlist *p,int n,int nums);//添加节点
void Remove(Sqlist *p,int n);//移除节点
void Cha_Zhao(Sqlist *p,int n);//查找节点位置的数字
void Zhao_wei(Sqlist *p,int nums);//查找某数字的位置
void Qian_Qu(Sqlist *p,int nums);//找前驱
void Hou_Qu(Sqlist *p,int nums); //找后驱
void Print(Sqlist *p);//打印数字
Sqlist *Scanf(Sqlist *p);//初始化并输入数字
void Clear(Sqlist *p);//清除链表中数字和节点
int main()
{
Display();
Sqlist *head;
int n=0, nums=0;//输入的位置和要插入的数字
int num=0;
scanf("%d",&num);
while(true)
{
if(decide==false)
{
if((num==1)||(num==11) )
{}
else
{
num=14;
}
}
switch(num)
{
case 1:
head=Start_restart();
break;
case 2:
Delet(head);
break;
case 3:
printf("有%d个数字\n",sum);
break;
case 4:
printf("输入所指位置:");
scanf("%d",&n);
if(n<=sum&&n>0)
Cha_Zhao(head,n);
else
printf("输入位置不合理\n");
break;
case 5:
printf("输入所指数字:");
scanf("%d",&nums);
Zhao_wei(head,nums);
break;
case 6:
printf("输入所指找前驱的数字:");
scanf("%d",&nums);
Qian_Qu(head,nums);
break;
case 7:
printf("输入所指找后驱的数字:");
scanf("%d",&nums);
Hou_Qu(head,nums);
break;
case 8:
printf("输入插入位置和数字:");
scanf("%d %d",&n,&nums);
if(n<=sum+1&&n>=1)
Add(head,n,nums);
else
printf("要插入的位置不合理!!!\n");
break;
case 9:
printf("输入删除位置:");
scanf("%d",&n);
if(n<=sum&&n>=1)
Remove(head,n);
else
printf("要删除的位置不合理!!!\n");
break;
case 10:
if(sum>0)
Print(head);
else
printf("没有数字!!!\n");
break;
case 11:
head=Scanf(head);
break;
case 12:
printf("你选择退出!!!\n");
Delet(head);
return 0;
case 13:
Clear(head);
break;
case 14:
printf("没有初始化或数不合法!!!\n");
break;
default:
printf("你输入的数字不合法!!!\n");
break;
}
system("PAUSE");
system("CLS");
printf("\n");
Display();
scanf("%d",&num);
}
return 0;
}
void Display()
{
printf("可操作有:\n");
printf("*****************************************************************\n");
printf("**************1.初始化或重置链表 **********************\n");
printf("**************2.销毁链表 **********************\n");
printf("**************3.链表中数据元素个数 **********************\n");
printf("**************4.所指位序的元素值 **********************\n");
printf("**************5.链表已存在元素 **********************\n");
printf("**************6.请输入元素,求直接前驱 **********************\n");
printf("**************7.请输入元素,求直接后驱 **********************\n");
printf("**************8.在第i个位置插入元素 **********************\n");
printf("**************9.删除第i个元素 **********************\n");
printf("**************10.输出所输入的链表元素 **********************\n");
printf("**************11.初始化并输入链表 **********************\n");
printf("**************12.退出 **********************\n");
printf("**************13.清空链表 **********************\n");
printf("*****************************************************************\n");
printf("请输入你的选择:");
}
Sqlist* Start_restart(){
Sqlist* head;
head=(Sqlist*)malloc(sizeof(Sqlist));
if(!head)
{
printf("初始化或重置失误\n");
return 0;
}
if(sum==0)
head->next=NULL;
else{
Sqlist *p1,*p2;
head->next=p1;
for(;sum>1;sum--)
{
p2=p1->next;
free(p1);
p1=p2;
}
free(p1);
p1=NULL;
p2=NULL;
}
sum=0;
printf("初始化或重置成功\n");
decide=true;
return head;
}
void Delet(Sqlist *head)
{
if(sum==0)
free(head);
else{
Sqlist *p1,*p2;
p1=head->next;
for(;sum>1;sum--)
{
p2=p1->next;
free(p1);
p1=p2;
}
free(p1);
free(head);
p1=NULL;
p2=NULL;
}
sum=0;
printf("列表删除成功!!!\n");
decide=false;
}
void Cha_Zhao(Sqlist *p,int n){
Sqlist *p1;
while(i!=n)
{
p1=p->next;
p=p1;
i++;
}
printf("你要找%d位置的数为%d",n,p->Data);
i=0;
}
void Zhao_wei(Sqlist *p,int nums){
Sqlist *p1;
do
{
p1=p->next;
p=p1;
i++;
}while(p->Data!=nums&&i<=sum);
if(i<=sum)
printf("你要找%d位置是为%d\n",nums,i);
else
printf("你要找%d不存在位置\n",nums);
i=0;
}
void Qian_Qu(Sqlist *p,int nums){
Sqlist *p1,*p2;
do
{
p2=p1;
p1=p->next;
p=p1;
i++;
}while(p->Data!=nums&&i<sum);
if(i!=1)
printf("你要找%d位置的前驱是为%d",nums,p2->Data);
else
printf("输入的位置没有前驱!!!\n");
i=0;
}
void Hou_Qu(Sqlist *p,int nums){
Sqlist *p1;
do
{
p1=p->next;
p=p1;
i++;
}while(p->Data!=nums&&i<sum);
if(i<sum)
{
p1=p->next;
printf("你要找%d位置的前驱是为%d",nums,p1->Data);
}
else
printf("输入的位置没有后驱!!!\n");
i=0;
}
void Add(Sqlist *p,int n,int nums)
{
Sqlist *node,*p1;
node=(Sqlist*)malloc(sizeof(Sqlist));
node->Data=nums;
node->next=NULL;
if(n==1&&sum==0)
{
p->next=node;
}
else if(n==1)
{
p1=p->next;
p->next=node;
node->next=p1;
}
else
{
while(i<n-1)
{
p1=p->next;
i++;
p=p1;
}
p1->next=node;
node->next=p->next;
p1=NULL;
}
i=0;
sum++;
printf("插在%d的%d成功\n",n,nums);
}
void Remove(Sqlist *p,int n){
Sqlist *p1,*p2;
while(i!=n)
{
p2=p;
p1=p->next;
p=p1;
i++;
}
printf("你要删除%d位置的数为%d",n,p->Data);
p2->next=p->next;
free(p);
sum--;
p1=NULL;
p2=NULL;
i=0;
}
void Print(Sqlist *p)
{
Sqlist *node;
printf("列表有: ");
while(i<sum)
{
node=p->next;
printf("%d\t",node->Data);
p=node;
i++;
}
i=0;
}
Sqlist *Scanf(Sqlist *p)
{
if(sum>0)
{
Clear(p);
free(p);
}
Sqlist* head;
head=(Sqlist*)malloc(sizeof(Sqlist));
int k=0,num=0;
printf("输入负数结束\n");
scanf("%d",&k);
while(k>=0)
{
num++;
Add(head,num,k);
scanf("%d",&k);
}
decide=true;
return head;
}
void Clear(Sqlist *p)
{
Sqlist *p1;
p1=p->next;
while(i<sum)
{
p=p1;
p1=p->next;
free(p);
i++;
}
p1=NULL;
sum=0;
i=0;
printf("清空完成!!!\n");
}