#include <string.h>
#include <conio.h>
#include <stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define ERROR 0
#define OK 1
typedef int ElemType;
typedef int Status;
typedef struct LNode
{
ElemType data;
struct LNode *next;
struct LNode *head;
}LNode,*Node,LinkList;
Status CreateList_L(LinkList &L); //建立空列表的函数的声明
Status OutputData_L(LinkList L); //输出数据的函数声明
Status LinkList_L(LinkList &L); //插入元素的函数
Status ListDelete_L(LinkList &L); //删除元素的函数声明
Status MergeList_L(); //顺序表的合并函数的声明
//主函数进行操作
int main()
{
LinkList T;
printf("1.输入数据 2.输出数据 3.插入数据 4.删除数据 5.归并顺序列表 6.退出程序/n");;
int num;
while(1) //无限循环
{
printf("请选择操作:");
scanf("%d",&num);
switch(num)
{
case 1:CreateList_L(T);break;
case 2:OutputData_L(T);break;
case 3:LinkList_L(T);break;
case 4:ListDelete_L(T);break;
case 5:MergeList_L();break;
case 6:exit(0);break;
}
}
return 0;
}
//插入元素的函数
Status LinkList_L(LinkList &L)
{
int i,j;
ElemType e;
LNode *p,*s;
printf("请输入插入的位置i和元素e:");
scanf("%d",&i);
scanf("%d",&e);
p=L.head;
j=0;
while(p&&j<i-1)
{
p=p->next;
++j;
}
if(!p||j>i-1) return ERROR;
s=(LNode *)malloc(sizeof(LNode));
s->data=e;
s->next=p->next;
p->next=s;
printf("/n");
return OK;
}
//删除元素的函数
Status ListDelete_L(LinkList &L)
{
int i,j;
ElemType e;
LNode *p,*q;
printf("请选择插删除的位置i:");
scanf("%d",&i);
p=L.head;
for(j=0;j<i-1;j++)
{
p=p->next;
}
q=p->next;
p->next=q->next; //q->next->next 指向后一个
e=q->data; //(q->data)=e
free(q);
OutputData_L(L);
return OK;
}
//输出数据的函数
Status OutputData_L(LinkList L)
{
LNode *p;
p=L.head; //L的定义在创建链表中 是指基址
printf("输出数据为:");
do
{
p=p->next;
printf("%d ",p->data);
}while(p->next);
printf("/n/n");
return OK;
}
Status CreateList_L(LinkList &L)
{
int n;
printf("请输入元素总个数n:");
scanf("%d",&n);
LNode *p,*q;
L.head=(LNode *)malloc(sizeof(LNode));
L.head->next=NULL;
p=L.head;
ElemType *s;
s=new ElemType[n];
printf("请输入%d个数:",n);
for(int i=0;i<n;i++)
{
scanf("%d",&s[i]);
q=(LNode *)malloc(sizeof(LNode));
q->data=s[i];
q->next=p->next;
p->next=q;
p=p->next;
}
delete s;
printf("/n");
return OK;
}
//以下为归并的部分
CreateList_Lc(LinkList &L)
{
L.head=(LNode *)malloc(sizeof(LNode));
L.head->next=NULL;
return OK;
}
Status MergeList_L()
{
LinkList La,Lb,Lc;
LNode *pa,*pb,*pc;
system("cls");
printf("创建非递减排列顺序表a:/n");
CreateList_L(La);
printf("创建非递减排列顺序表b:/n");
CreateList_L(Lb);
CreateList_Lc(Lc);
pa=La.head->next;
pb=Lb.head ->next;
Lc.head=pc=La.head; //用pa的头结点做pc的头结点---实现方法很有研究,相当于pc=La.head;Lc.head=pc;两步。
while (pa&&pb)
{
if(pa->data<=pb->data)
{
pc->next=pa;
pc=pa;
pa=pa->next;
}
else
{
pc->next=pb;pc=pb;pb=pb->next;
}
}
pc->next=pa? pa:pb;
free(Lb.head);
printf("/n合并顺序表a,b后顺序表c如下:/n");
OutputData_L(Lc);
return 0;
}
/*终于搞出来了,别笑,这对我确实不容易的。*/