//终于把链表给写了
#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对不起,没有你要选择的操作");
}
}
}