SingleList单链表

作者在 2017-04-11 17:29:26 发布以下内容
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>

struct Node;
typedef struct Node *PtrToNode;
//typedef PtrToNode List; 
typedef PtrToNode Position;

struct Node
{
int Element;   //元素 
//int Subscrit;  //下标 
struct Node *Next;    
};

Position Create(void);  //创建链表 
void TraverseList(Position Head);//遍历 
void FindPosition(Position Head);   //根据元素找下标 
void FindElement(Position Head); //根据下标位置找元素
void Insert(Position Head);    //插入元素 
void Delete(Position Head);   //删除元素 
int GetListLenth(Position Head);  //插入和删除操作时,判断序号正误

int main()  //主函数 
{
Position Head;
Head=Create();
TraverseList(Head);  //先遍历 

int Choose;
printf("1.输入序号查找元素\n2.输入元素输出序号\n3.插入元素\n4.删除元素\n5.退出\n请输入你的选择:");
scanf("%d",&Choose);
switch(Choose)
{
   case 1:
    FindElement(Head);     break;   
   case 2:
    FindPosition(Head);    break; 
   case 3:
    Insert(Head);       break;
   case 4:
    Delete(Head);       break;
   case 5:
                          break;
   default:
    printf("选项输入有误!\n");     break;
}
return 0;
 } 

Position Create(void)    //创建链表 
{
Position Head,New,Tail;
int i,arr[]={21,3,15,27,11,18};
New=Tail=NULL;   //New是用来开辟新的node,Tail是尾node 
Head=malloc(sizeof(struct Node));

if(Head==NULL)
{
printf("空间不足! \n");
exit(0);     //跳到函数尾 
}
Head->Element=0;    //初始化头指针 
Head->Next=NULL;
Tail=Head;          //初始事尾就是头 

for(i=0;i<6;i++)
{
New=malloc(sizeof(struct Node));
if(New==NULL)
{
printf("空间不足! \n");
   exit(0);     //跳到函数尾
}
New->Element=arr[i];  //元素值  
New->Next=NULL;       //新开辟的node总数在末尾 
Tail->Next=New;       //旧尾部Tail的Next就是新的尾部New 
Tail=New;             //旧尾部Tail变成新的尾部New 
}
//printf("已创建链表!\n"); 
return Head; //返回头指针,这步很重要 
}

void TraverseList(Position Head)  //遍历 
{
Head=Head->Next;
while(Head!=NULL)  //只要不是尾,就输出其元素的值 
{
printf("%d ",Head->Element);
Head=Head->Next;
}
printf("\n输出结束!\n");
}

void FindElement(Position Head)  //根据序号位置找元素 
{
int i=1,SubLabel;
printf("请输入序号:");
scanf("%d",&SubLabel); 

Head=Head->Next;
while(Head!=NULL)
{
if(i==SubLabel)
{
printf("序号%d对应的元素为%d\n",SubLabel,Head->Element);   //判断序号不存在的条件 
break;
}
else if(Head->Next==NULL&&i<SubLabel)
printf("输入的序号异常!\n");
i++;
Head=Head->Next;
}
}

void FindPosition(Position Head)  //根据元素找序号
{
int SubLabel=1;
int X;
printf("请输入元素值:");
scanf("%d",&X);

Head=Head->Next;
while(Head!=NULL)
{

if(Head->Element==X)
{
printf("元素%d的序号为%d \n",X,SubLabel);
break;
}
else if(Head->Next==NULL&&Head->Element!=X)   //判断元素不存在的条件 
       printf("不存在这个元素!\n");
SubLabel++;
Head=Head->Next;
}
}


void Insert(Position Head)  //插入一个元素 
{
int X,SubLabel;
Position Head0=Head;    //用来重新遍历 

printf("请输入要插入的值:");
scanf("%d",&X);
printf("请输入%d要插入的序号:",X);
scanf("%d",&SubLabel);

if(SubLabel>0&&SubLabel<GetListLenth(Head)+2)
{
Position New=NULL;        //代码规范 
New=malloc(sizeof(struct Node));    //开辟内存 
   if(New==NULL)
      {
      printf("空间不足插入失败!\n");
      exit(0);
      }
while(1)
{
SubLabel--;
if(SubLabel==0)
break;       //打破时Head就是序号对应的位置的再前面一个位置(指针)  
Head=Head->Next;   
}
New->Element=X;       //赋予New的元素值 
New->Next=Head->Next; //将New与下一个元素连接起来 
Head->Next=New;      //将New与上一个元素连接起来  
TraverseList(Head0);  
}
else printf("输入的序号异常!\n");
}


void Delete(Position Head)  //根据序号删除一个序号 
{
int SubLabel;
Position Deletion;
Position Head0=Head;   //用于重新遍历 

printf("请输入要删除的元素个数的序号:");
scanf("%d",&SubLabel);
if(SubLabel>0&&SubLabel<GetListLenth(Head)+1)  //序号存在的情况下进行 
{
while(Head!=NULL)   //这个循环跟插入时的循环作用一样 
{
SubLabel--;
if(SubLabel==0)
break; 
Head=Head->Next;
}
Deletion=Head->Next;   //得到要删除的序号的地址 
Head->Next=Deletion->Next;  //删除:跳过序号对应的地址 
free(Deletion);             //删除:一定要释放空间 
TraverseList(Head0);
}
else printf("输入的序号异常!\n"); 
 } 


int GetListLenth(Position Head)  //获取链表的元素个数 
{
int Lenth=0;
Head=Head->Next;
while(Head!=NULL)
{
Lenth++;
Head=Head->Next;
}
return Lenth;
}

C语言 | 阅读 2735 次
文章评论,共0条
游客请输入验证码