单链表

来源:互联网 发布:广东影响力网络盛典 编辑:程序博客网 时间:2024/06/16 06:06


/*要求:实现单链表的各种基本算法
添加:插入和销毁
作者: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;
}


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

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

0 0
原创粉丝点击