链表

来源:互联网 发布:centos下安装图形界面 编辑:程序博客网 时间:2024/06/06 18:47

//终于把链表给写了
#include<iostream>
#include<cstdio>
#include<string>
//#include<conio.h>
#include<dos.h>// 用来清屏
using namespace std;
const int list_size = 1000;
const int list_SIZE = 10;
typedef struct node
{
 int data;
 struct node *next;
}Node;


/*
typedef struct
{
 int *elem; // 存储空间基址
 int len;   // 当前长度
 int listsize; //当前分配的存储容量(以sizeof(int))为单位
}list;
*/
/*
void empty(list &l)
{
 l.elem = NULL;
}//构造空表
*/
void setnull(Node *&p) //指针的传参引用
{
 p = (Node *) malloc(sizeof(Node));
 p->next = NULL;
}//构造空表

/*
int Initlist(list &l)
{
 l.elem = (int *)malloc(list_size*(sizeof(int)));
 if(!l.elem)
 {
  printf("/n/t/t分配内存失败");
  return 0;
 }
 l.len = 0;
 l.listsize = list_size;
 return 1;
}//构造顺序表
*/

void creathead(Node *&l) //指针的传参引用
{
 Node *p;
 l = (Node *) malloc(sizeof(Node));//创建头结点
 l->next = NULL;
 int n;
 int i;
 printf("/n/t/t输入顺序表的长度 n = ");
 scanf("%d", &n);
 printf("/n/t/t输入各个元素:");
 for(i = 0; i < n ; i++)
 {
  p = (Node *) malloc(sizeof(Node));//创建新的结点
  scanf("%d", &p->data);
  p->next = l->next;
  l->next = p;
  
 }
}// 头插法建立单链表 1

void creatend(Node *&l)
{
 Node *p, *q;
 l = (Node *) malloc(sizeof(Node));//创建头结点
 l->next = NULL;
 int n;
 int i;
 printf("/n/t/t输入顺序表的长度 n = ");
 scanf("%d", &n);
 printf("/n/t/t输入各个元素:");
 q = l; //q 指向头结点
 for(i = 0; i < n ; i++)
 {
  p = (Node *) malloc(sizeof(Node));//创建新的结点
  scanf("%d", &p->data);
  q->next = p; // 将 p插入q 之后
  q = p;
  //p->next = l->next;
  //l->next = p;
  
 }
 q->next = NULL; //终端结点的next 设置为NULL
}// 尾插法建立单链表

 

 /*
 int n;
 printf("/n/t/t输入顺序表的长度 n = ");
 scanf("%d", &n);
 l.len = n;
 //int i;
 printf("/n/t/t输入各个元素:");
 int *p, *q;
 p = &l.elem[0];
 q = l.elem + l.len - 1;
 for(p; p <= q; p++)
  scanf("%d", p);// 本来scanf 读入的时候就要就要加&的,这里是指针就不用*了,加了,纠结了好久
  */
 /*
 for(i = 0; i < l.len; i++)
   scanf("%d", &l.elem[i]);
   */
//}//创建顺序表

int length(Node *p) //引用指针
{
 int n = 0;
 Node *q;
 q = p->next;
 while(q != NULL)
 {
  n++;
  q = q->next;
 }
 return n;
}//求链表的长度

int get(Node *p, int n) //引用指针
{
 Node *q;
 q = p->next;
 int j = 0;
 while(j < n && q != NULL)
 {
  q = q->next;
  j++;
 }
 if(q != NULL)
 {
  return q->data;
 }
 else
 {
  printf("/n/t/t参数位置不正确/n");
  return 0;
 }
 /*
 if(n < 0 || n > l.len)
 {
  printf("/n/t/t参数位置不正确/n");
  return 0;
 }

 int *p;
  p = &l.elem[n- 1];
  return *p;
 //return l.elem[n- 1];
 */
} //取链表中第n个元素 5

int lacate(Node *p, int x)
{
 Node *q;
 q = p->next;
 int i = 0;
 while(q != NULL && q->data != x)
 {
  i++;
  q = q->next;
 }
 if(q == NULL)
 {
  printf("/n/t/t没有你要找的x 元素");
  return 0;
 }
 else
 {
  printf("/n/t/t你所要查询x的位置为: %d", i);
  return 0;
 }
 /*
 int i = 0;
 for(i = 0; i < l.len; i++)
  if(l.elem[i] == x)
   return i + 1;
 return -1;//表示没有找到x
 */

}//查找链表中为x的元素,返回其下表

int insnode(Node *&p, int i, int x)
{
 Node *q, *r;
 q = (Node *) malloc(sizeof(Node)); //建立要插入的结点q
 r = p->next;
 q->data = x;
 int j = 0;
 if( i == 0) // 将
 {
  q->next = p->next;
  p->next = q;
 }
 else
 {
  while(j < i && r != NULL)
  {
   j++;
   r = r->next;
  }
  if(r == NULL)
  {
   printf("/n/t/t你要插入的x 元素的位置不正确");
   return 0;
  }
  else
  {
   q->next = r->next;
   r->next = q;

  }
 }
 return 1;
}


 /*
 if(i <= 0 || i > l.len + 1)
 {
  printf("/n/t/t插入的位置不正确/n");
  return 0;
 }
 if(l.len >= l.listsize)
 {
  int *newbase;
  newbase = (int *)realloc(l.elem, (l.listsize + list_SIZE) * sizeof(int));
  if( !newbase )
  {
   printf("/n/t/t分配内存失败");
   return 0;
  }
  l.elem = newbase;
  l.listsize += list_SIZE;
 }
 if(l.len + 1 == i)
 {
  l.elem[l.len] = x;
  l.len ++;
  return 1;
 }
 int *q, *p;
 q = &l.elem[i -1];
 for(p = &l.elem[l.len - 1]; p>= q; p--)
  *(p + 1) = *p;
 *q = x;
 l.len++;
 return 1;
 */
 /*
 if(i < 0 || i > l.len)
 {
  printf("/n/t/t插入的位置不正确/n");
  return 0;
 }
 int j;
 l.len++; //这里不要忘记了加
 for(j = l.len; j >= i; j--)
  l.elem[j] =l.elem[j - 1];
 l.elem[i - 1] = x;
 return 1;
 */
//}//在顺序表位置为i的地方插入x

int  delnode(Node *&p, int i, int &e)
{
 Node *q, *r,*s;
 r = p->next;
 int j = 0;
 int ee;
 if(i == 0)
 {
  q = p->next;  //删除首元素的结点
  p->next = q->next;
  free(q);
 }
 else
 {
  while(j < i  && r != NULL)
  {
   j++;
   r = r->next;
  }
  if(r == NULL)
  {
   printf("/n/t/t你要删除的位置i不正确");
   return 0;
  }
  else
  {
   s = r->next;
   ee = r->data;
   r ->next = s->next;
   free(s);
  }
 }
 e = ee;
 return 1;

 /*
 if(i < 0 || i > l.len)
 {
  printf("/n/t/t删除的位置不正确/n");
  return 0;
 }
 int *p, *q;
 p = &l.elem[i - 1];
 e = *p;
 q = l.elem + l.len - 1;
 for(p; p < q; p++)
  *p = *(p + 1);
 l.len--;
 return 1;
 */
 /*
 if(i < 0 || i > l.len)
 {
  printf("/n/t/t删除的位置不正确/n");
  return 0;
 }
 int j;
 for(j = i; j < l.len; j++)
  l.elem[j - 1] = l.elem[j];
 l.len--;
 return 1;
 */
}  //删除顺序表位子为i 的元素

void display(Node *p)
{
 Node *q;
 q = p->next;
 int n = length(p);
 if(n == 0)
 {
  printf("/n/t/t此表为空表");
 }
 else
 {
  printf("/n/t/t");
  for(int i = 0; i < n; i++)
  {
   printf("%d ", q->data);
   q = q->next;
  }
 }
 /*
 int *p, *q;
 p = &l.elem[0];
 q = l.elem + l.len - 1;
 for(p; p <= q; p++)
  printf("%d ", *p);
  */
 /*
 int i;
 printf("/n/t/t");
 for(i = 0; i < l.len; i++)
  printf("%d ",l.elem[i]);
  */
}//显示顺序表

void fun()
{
  printf("/n/t/t*********************************************************");
  printf("/n/t/t*********      1  构造空表                      *********");
  printf("/n/t/t*********      2  头插法建立单链表              *********");
  printf("/n/t/t*********      3  尾插法建立单链表              *********");
  printf("/n/t/t*********      4  求链序表的长度                *********");
  printf("/n/t/t*********      5  取表中第n个元素               *********");
  printf("/n/t/t*********      6  查找顺序表中为x的元素         *********");
  printf("/n/t/t*********      7  链序表位置为i的地方插入x       *********");
  printf("/n/t/t*********      8  删除链序表位子为i 的元素      *********");
  printf("/n/t/t*********      9  显示链序表                    *********");
  printf("/n/t/t*********      10  清除屏幕                     *********");
  printf("/n/t/t*********      11 退出循环                      *********");
  printf("/n/t/t*********************************************************");
  printf("/n");

}
int main()
{
 Node *l;
 int a;
        //printf("/n/n/n/n");
  printf("/n/t/t*********************************************************");
  printf("/n/t/t*********      1  构造空表                      *********");
  printf("/n/t/t*********      2  头插法建立单链表              *********");
  printf("/n/t/t*********      3  尾插法建立单链表              *********");
  printf("/n/t/t*********      4  求链序表的长度                *********");
  printf("/n/t/t*********      5  取表中第n个元素               *********");
  printf("/n/t/t*********      6  查找顺序表中为x的元素         *********");
  printf("/n/t/t*********      7  链序表位置为i的地方插入x       *********");
  printf("/n/t/t*********      8  删除链序表位子为i 的元素      *********");
  printf("/n/t/t*********      9  显示链序表                    *********");
  printf("/n/t/t*********      10  清除屏幕                     *********");
  printf("/n/t/t*********      11 退出循环                      *********");
  printf("/n/t/t*********************************************************");
  printf("/n");
 //Initlist(l);
 while(1)
 {
  printf("/n/t/t请输入你要的操作 a = ");
  scanf("%d", &a);
  if(a == 1)
  {
   setnull(l);
   printf("/n/t/t你创建的为空表");
   
  }
  else if(a == 2)
  {
   creathead(l);
   printf("/n/t/t显示头插法之后的顺序表:");
   display(l);

  }
   else if(a == 3)
  {
   creatend(l);
   printf("/n/t/t显示尾插法插入后的链表:");
   display(l);
  }
  else if(a == 4)
  {
   printf("/n/t/t%d", length(l));
  }
  
  else if(a == 5)
  {
   int n;
   printf("/n/t/t请输入你要取的链表的位置:");
   scanf("%d", &n);
   printf("/n/t/t位置为b的元素为:%d", get(l,n));

  }
  else if(a == 6)
  {
   int x;
   printf("/n/t/t查找顺序表中为x的元素x = ");
   scanf("%d", &x);
   if( lacate(l, x) == -1)
    printf("/n/t/t没有找到元素x");
   else
   {
    
    printf("/n/t/t输出元素x的位置:%d", lacate(l, x));
   }
  }
  else if(a == 7)
  {
   int i, x;
   printf("/n/t/t输入你要插入位置i = ");
   scanf("%d", &i);
   printf("/n/t/t输入你要插入的元素x = ");
   scanf("%d", &x);
   insnode(l, i, x);
   printf("/n/t/t显示插入后的顺序表:");
   display(l);

 

  }
  else if(a == 8)
  {
   int i;
   int n;
   printf("/n/t/t输入你要删除的位置i = ");
   scanf("%d", &i);
   delnode(l, i, n);
   printf("/n/t/t显示删除的元素:%d",n);
   printf("/n/t/t显示s删除后的链表:");
   display(l);
  }
  else if(a == 9)
  {
   printf("/n/t/t显示链表:");
   display(l);
  }
  else if(a == 10)
  {
   system("cls");
   fun();
   //clrscr();
  }
  else if(a == 11)
  {
   break;
  }
  else
  {
   printf("/n/t/t对不起,没有你要选择的操作");
  }

 }
}