#include<stdio.h>
#include<stdlib.h>
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int ElemType; // 用ElemType来代替int类型
typedef struct List{
ElemType *elem;
int length;
int listsize;
}List;
int OVERFLOW;
#define ERROR
void create_List(List &L,int n) //建立链表
{
int i;
L.elem=(ElemType *)malloc(LIST_INIT_SIZE * sizeof (ElemType));//给链表分配长度
L.listsize=LIST_INIT_SIZE;
L.length=n; //链表的长度
for (i=0;i<n;i++)
scanf("%d",&L.elem[i]);
//输入链表的数据
/* for(i=0;i<n;i++)//链表的数据按从小到大的顺序排列
{
int first=0;
if(L.elem[i]>L.elem[i+1])
{
first=L.elem[i];
L.elem[i]=L.elem[i+1];
L.elem[i+1]=first;
}
}*/
for(i=0;i<n;i++)
printf("%d ",L.elem[i]);//输出数据
printf("构建列表成功\n");
printf("\n");
}
void length_List(List L)//检查链表的长度
{
printf("顺序表的长度 length_List=%d\n",L.length);
int i;
for(i=0;i<L.length;i++)
{
printf("%d ",L.elem[i]);
}
printf("\n");
}
void insert_List(List &L,int i ,int e) //i表示插入链表的位置,e表示插入的元素
{
if(i<1 || i> L.length+1)//判断i的位置是否在范围内
return ERROR;
int *newbase;
if(L.length >= L.listsize)
newbase=(ElemType *)realloc(L.elem,(L.length+ LISTINCREMENT) * sizeof (ElemType));//储存空间不足时,增加分配
//if(!newbase)
//exit(OVERFLOW);//判断是否分配成功
L.elem=newbase;
L.listsize+=LISTINCREMENT;//分配后的链表的容量
ElemType *q,*p;
q=&L.elem[i-1];//q表示插入的位置
for(p = &L.length-1;p>=q;p--)
*(p+1)=*(p);
*q=e;
++L.length;//链表的长度增加1
}
void delete_List(List &L,int i,int &e)//i表示删除的位置,e表示删除的元素
{
//int i;
if(i<1 || i>L.length+1)//判断删除的位置是否在范围内
return ERROR;
int *q,*p;
q=&L.elem[i-1];//q表示删除的位置,e表示删除的元素
e=*q;
p=&L.length-1;
for(q=&L.elem[i-1];q<p;q++)
*(q) = *(q+1);
L.length--;//链表减一
}
void union_List(/*List &La, int n,List &Lb,int n,*/List &Lc ,int n )
{
//int i;
List La,Lb;
printf("请输入你需要构建的列表长度\n");
scanf("%d",&n);
create_List(La,n);
printf("这是表La\n");
printf("请输入你需要构建的列表长度\n");
scanf("%d",&n);
create_List(Lb,n);
printf("这是表La\n");
int *pc;
Lc.length = La.length + Lb.length;
Lc.elem=(ElemType *)malloc(Lc.length* sizeof (ElemType));//重新建立长度为La+Lb的链表Lc;
pc=Lc.elem;
if(!Lc.elem)
exit(OVERFLOW);//判断是否建立成功
int *pa,*pb;
pa=La.elem;
pb=Lb.elem;
int *pa_last,*pb_last;
pa_last=&La.length-1;
pb_last=&Lb.length-1;
while(pa<=pa_last && pb<=pb_last)
{
if(*pa<=*pb)
{
if(*pa=*pb)
{
*pc++ = *pa;
*pa++;
*pb++;
}
else
{
*pc++ = *pa;
*pa++;
}
}
else
{
*pc++ = *pb;
*pb++;
}
}
while(pa<=pa_last)
{
*pc++ = *pa;
*pa++;
}
while(pb<pb_last)
{
*pc++ = *pb;
*pb++;
}
}
int main()
{
int n;
int i;
List L,Lc;
int e;
char choose;
while(1)
{
printf("输入 1 ,建立链表\n");
printf("输入 2 ,检测链表的长度\n");
printf("输入 3 ,在链表中插入新的元素\n");
printf("输入 4 ,删除链表中的元素\n");
printf("输入 5 ,合并连个链表\n");
printf("输入 6 ,结束\n");
printf("你的选择: ");
choose=getchar();
switch(choose)
{
case '1' : printf("请输入你需要构建的列表长度\n");
scanf("%d",&n);
create_List(L,n);
break;
case '2' : length_List(L);break;
case '3' : printf("请输入插入的位置,插入的数值\n");
scanf("%d,%d",&i,&e);
insert_List(L,i,e);
break;
case '4' : printf("请输入删除元素的位置\n");
scanf("%d",&i);
delete_List(L,i,e);break;
case '5' : union_List(Lc,n);break;
case '6' : break;
default : printf("输入错误!/n");continue;
}
if(choose=='6')
break;
}
/*printf("请输入你需要构建的列表长度\n");
scanf("%d",&n);
create_List(L,n);
length_List(L,n);
printf("请输入插入的位置,插入的数值\n");
scanf("%d,%d",&i,&e);
insert_List(L,i,e);
printf("请输入删除元素的位置\n");
scanf("%d",&i);
delete_List(L,i,e);
union_List(La,Lb);*/
return 0;
}
liganglester
袁力
思君满月