单链表

    xiaoxiao2021-12-14  18

    

    /*要求:实现单链表的各种基本算法 添加:插入和销毁 作者:ys 日期:16.10.13 添加日期:10.17,10.18*/

    #include<stdio.h> #include<malloc.h> #include<stdlib.h> #include<iostream> using namespace std;

    #define maxsize 50; typedef char ElemType; typedef struct LNode//定义单链表结点类型 {  ElemType data;  struct LNode *next; }Linklist;

    /*实现单链表的各种基本运算的算法 1、初始化 2、输入 3、插入 4、输出即显示 5、求长度 6、判断是否为空 7、输出第i位置的元素 8、查找一个给定元素在表中的位置 9、删除 10、释放单链表 0、退出*/

    void Initlist(Linklist *&L);//初始化链表函数的声明 bool Inputlist(Linklist *L);//输入函数的声明 void Insertlist(Linklist *&L);//插入函数的声明 void Dislist(Linklist *L);//输出函数的声明 int Listlength(Linklist *L);//求长度函数的声明 bool Listempty(Linklist *L);//判空函数的声明 bool Getelem(Linklist *L);//求值函数的声明 void LocateElem(Linklist *L);//查找函数的声明 bool Delectlist(Linklist *&L);//删除函数的声明 bool Destroylist(Linklist *&L);//销毁函数的声明

    void main() {  //1、变量的定义:  int n;//操作数  Linklist *H;  int len;//求长度的值  bool i;//求值的返还类型

       //2、菜单  for(;;)  {   printf("单链表的基本操作如下:\n");   printf("1、初始化\t");   printf("2、输入\n");   printf("3、插入   \t");   printf("4、输出\n");   printf("5、求长度 \t");   printf("6、判空\n");   printf("7、求值   \t");   printf("8、查找\n");   printf("9、删除   \t");   printf("10、销毁  \t");   printf("0、退出\n");   printf("请选择操作步骤:  ");   scanf("%d",&n);   switch(n)   {    case 1:     printf("执行初始化操作!\n");     Initlist(H);     break;    case 2:     printf("执行链表的输入!\n");     Inputlist(H);     break;    case 3:     printf("执行链表的插入!\n");     Insertlist(H);     Dislist(H);     break;    case 4:     printf("执行链表的输出!\n");     Dislist(H);     break;    case 5:     printf("执行链表的求长度!\n");     len = Listlength(H);     printf("链表的长度为:%d\n",len);     break;    case 6:     printf("执行链表的判空!\n");     printf("该链表为%s!\n",Listempty(H)?"空":"非空");     break;    case 7:     printf("执行链表的求值!\n");     i = Getelem(H);     if(i == false)     {      printf("取值失败!请输入%d以内的值\n",Listlength(H));     }     break;    case 8:     printf("执行链表的查找!\n");     LocateElem(H);     break;    case 9:     printf("执行链表的删除!\n");     Delectlist(H);     break;    case 10:     printf("执行链表的释放!\n");     Destroylist(H);     break;    case 0:     exit(0);   }  } }

    void Initlist(Linklist *&L)//1.初始化链表的定义 {  L = (Linklist *)malloc(sizeof(Linklist));  L->next = NULL; }

    bool Inputlist(Linklist *L)//2.输入函数的定义 {  Linklist *s;  Linklist *p;  p = L;  int i;  i = 0;  printf("请输入个数:\n");  int n;  cin>>n;  if(L == NULL)   return false;  while(i < n)  {   s = (Linklist *)malloc(sizeof(Linklist));   printf("请输入链表的第%d个元素",i+1);   cin>>s->data;   p->next = s;//头指针为空   s->next = NULL;   p = p->next;   i++;  }  return true; }

    //L为指向链表的指针,n为插入的逻辑位置 void Insertlist(Linklist *&L)//3.插入函数的定义 {  Linklist *p = L;  int i;  i = 1;//循环变量初始化

     int n;  printf("请输入插入元素的逻辑位置:");  scanf("%d",&n);  if(n < 1 || n > Listlength(L))//判断loc是否合法  {   printf("取值失败!请输入%d以内的值\n",Listlength(L));  }  else if(p == NULL);   else   {    Linklist *s = (Linklist *)malloc(sizeof(Linklist));    printf("请输入插入的元素:");    cin>>s->data;

       while(i < n && p != NULL)//*p指向n位置    {     p = p->next;     i++;    }    if(p->next == NULL)    {     p->next = s;     s->next = NULL;    }    else    {     s->next = p->next;     p->next = s;    }   } }

    void Dislist(Linklist *L)//4.输出函数的定义 {  Linklist *p;  p = L->next;  printf("链表的全部元素如下:\n");

     while(p != NULL)  {   cout<<p->data<<" ";   p = p->next;  }  cout<<endl; }

    int Listlength(Linklist *L)//5.求长度函数的定义 {  int len;  len = 0;  Linklist *p = L;  while(p->next != NULL)  {   len++;   p = p->next;  }  return len; }

    bool Listempty(Linklist *L)//6.判空函数的定义 {  return (L->next == L); }

    bool Getelem(Linklist *L)//7.求值函数的定义 {  int loc;  printf("请输入要取值的逻辑位置:\n");  scanf("%d",&loc);  if(loc < 1 || loc > Listlength(L))//判断loc是否合法  {   return false;  }  Linklist *p = L;  int i = 0;  while(i < loc && p->next != NULL)  {   p = p->next;      i++;  }  cout<<"第"<<loc<<"个元素的值为:"<<p->data<<endl;  return true; }

    //注:L的头指针为空,返回值为其他表示查到了 void LocateElem(Linklist *L)//8.查找函数的定义 {  Linklist *p = L;  int loc;  printf("请输入要查找第几个元素:\n");  scanf("%d",&loc);//输入需查寻的逻辑位置  if(loc > Listlength(L))  {   printf("输入不合法,查找失败!");  }  else  {   int i;   i = 0;   while(i < loc)   {    p = p->next;    i++;   }   cout<<"元素为:"<<p->data<<endl;  } }

    //删除返回true bool Delectlist(Linklist *&L)//删除函数的定义 {  Linklist *pre = L;  Linklist *p = L->next;  printf("请输入删除的逻辑位置:");  int n;  scanf("%d",&n);  int i = 1;  while(i < n &&pre != NULL)//找到n个节点  {   i++;   pre = pre->next;  }  if(p == NULL)   return false;  else  {   p = pre->next;   if(p == NULL)    return false;   pre->next = p->next;   free(p);   return true;  }  /*if(pre->next != NULL)  {   while(i < n && pre != NULL)   {    p = p->next;    i++;   }  }  if(p->next = NULL)  {   free(p);   pre->next = NULL;   return true;  }  else  {   pre = p;   p = p->next;   pre->next = p->next;   free(p);   return true;  }*/ }

    bool Destroylist(Linklist *&L)//10.销毁函数的定义 {  Linklist *pre = L;  Linklist *p = pre->next;  while(p != NULL)  {   free(pre);   pre = p;   p = p->next;  }  free(pre);  return 1; }

    新手入门,不知道怎么将它写入文件,并且读出来。

    很纠结一个问题,输入链表的数据是写在分函数好呢,还是主函数好呢?为什么?

    转载请注明原文地址: https://ju.6miu.com/read-970496.html

    最新回复(0)