您的位置:首页 > 其它

链表操作

2016-03-27 19:16 405 查看
#include<stdio.h>
#include<malloc.h>
//typedef int ElemType;
int k=1,f;
typedef struct LNode{
int data;
struct LNode *next;
}LinkList;
void InitList(LinkList *&L){   //创建头结点
L=(LinkList *)malloc(sizeof(LinkList));
L->next=NULL;
}
void DispList(LinkList *L){//输出线性表
LinkList *p=L->next;
while(p!=NULL){
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int LocateElem(LinkList *L,int e){//按元素值查找
int i=1;
LinkList *p=L->next;
while(p!=NULL&&p->data!=e){
p=p->next;
i++;
}
if(p==NULL)
return(0);
else
return(i);
}
bool ListInsert(LinkList * &L,int i,int e){//插入
LinkList *p=L,*s,*q;
q=p;
p=p->next;
while(p!=NULL){
if(p->data==i){
s=(LinkList *)malloc(sizeof(LinkList));
s->data=e;
s->next=p;
q->next=s;
return true;
}
q=p;
p=p->next;
}
if(p==NULL && i==-1){
s=(LinkList *)malloc(sizeof(LinkList));
s->data=e;
s->next=NULL;
q->next=s;
return true;
}
return false;
}
void DestroyList(LinkList *&L){//销毁
LinkList *p=L,*q=p->next;
while(q!=NULL){
free(p);
p=q;
q=p->next;
}
free(p);
}
bool ListDelete(LinkList *&L,int e){//删除
//    int j=0;
LinkList *p=L,*q;
while(p!=NULL&&p->data!=e){
q=p;
p=p->next;
}
if(p==NULL)
return false;
else{
q->next=p->next;
free(p);
return true;
}
}
void ListHeBing(LinkList *&L1,LinkList *&L2){//合并
LinkList *p=L2->next;
while(p!=NULL){
if(LocateElem(L1,p->data))
p=p->next;
else{
ListInsert(L1,-1,p->data);
p=p->next;
}
}
}
/*int main(){
LinkList *h,*h1,*h2;
int e;
InitList(h);
printf("ssda\n");
ListInsert(h,-1,3);
ListInsert(h,-1,9);
ListInsert(h,-1,5);
ListInsert(h,-1,6);
ListInsert(h,-1,11);
ListInsert(h,-1,8);
printf("ssda\n");
DispList(h);
ListInsert(h,5,4);
ListInsert(h,5,7);
DispList(h);
ListDelete(h,11);
DispList(h);
InitList(h1);
ListInsert(h1,-1,1);
ListInsert(h1,-1,2);
ListInsert(h1,-1,4);
ListInsert(h1,-1,9);
ListInsert(h1,-1,10);
ListInsert(h1,-1,18);
ListHeBing(h,h1);
DispList(h);
}*/
void CJList(LinkList *&L){
printf("输入你要创建的链表按回车键结束:\n");
int n;
char c;
while(scanf("%d%c",&n,&c)!=EOF&&c!='\n'){
ListInsert(*&L,-1,n);
}
ListInsert(*&L,-1,n);
printf("以下是你创建的链表:\n");
printf("h%d: ",k);
DispList(*&L);
return;
}
int main(){
// LinkList *h1,*h2,*h3;
LinkList *h[50];
int e;
int m,n;
bool flag;
printf("输入对应的序号进行操作:\n");
printf("创建链表请扣1:\n");
printf("插入数据请扣2:\n");
printf("删除数据请扣3:\n");
printf("合并链表请扣4:\n");
printf("查看链表请扣5:\n");
printf("销毁链表请扣6:\n");
printf("退出请按0:\n");
while(~scanf("%d",&e)){
if(e==1){
InitList(h[k]);
CJList(h[k]);
k++;
}
if(e==2){
printf("你是要对第几条链表进行插入操作?请输入一个合理的数字!!\n");
int y;
scanf("%d",&y);
printf("以下是你要插入的链表:\n");
DispList(h[y]);
printf("输入两个数,第一个数是你要插入的数值,第二个是要插入哪个数值的前面:\n");
scanf("%d%d",&m,&n);
flag=ListInsert(h[y],n,m);
if(flag==true){
printf("插入成功!!\n");
printf("以下是你插入修改后的链表:\n");
printf("h%d: ",y);
DispList(h[y]);
}
else printf("插入失败!!\n");
}
if(e==3){
printf("你是要对第几条链表进行删除操作?请输入一个合理的数字!!\n");
int y;
scanf("%d",&y);
printf("以下是你要删除的链表:\n");
DispList(h[y]);
printf("输入你要删除的元素:\n");
scanf("%d",&m);
flag=ListDelete(h[y],m);
if(flag==true){
printf("删除成功!!\n");
printf("以下是你删除后的链表:\n");
printf("h%d: ",y);
DispList(h[y]);
}
else printf("删除失败!!\n");
}
// DestroyList(h1);
if(e==4){
int m,n;
printf("接下来进行链表合并:\n");
printf("你要对哪两条链表进行合并?:\n");
scanf("%d%d",&m,&n);
printf("以下是你要合并的两条链表:\n");
printf("h%d: ",m);
DispList(h[m]);
printf("\n");
printf("h%d: ",n);
DispList(h
);
//InitList(h[k]);
//  CJList(h[k]);
//  f=k;
//  k++;
// InitList(h[k]);
// CJList(h[k]);
ListHeBing(h[m],h
);
printf("以下是你合并后的链表:\n");
printf("h%d: ",m);
DispList(h[m]);
k--;
}
if(e==5){
printf("你要查看第几条链表?请输入一个合理的数字,如果要查看所有数组请输入-1:\n");
int y;
int i;
scanf("%d",&y);
if(y==-1){
for(i=1;i<k;i++){
printf("h%d: ",i);
DispList(h[i]);
}
}
else{
printf("以下是你要查看的第%d条链表:\n",y);
printf("h%d: ",y);
DispList(h[y]);
}
}
if(e==6){
printf("你要销毁第几条链表?请输入一个合理的数字,如果要销毁所有数组请输入-1:\n");
int y;
int i;
scanf("%d",&y);
if(y==-1){
for(i=1;i<k;i++)
DestroyList(h[i]);
}
else{
DestroyList(h[y]);
for(i=y;i<k;i++){
h[i]=h[i+1];
k--;
}
}
}
if(e==0) exit(0);
printf("\n"); printf("\n"); printf("\n"); printf("\n"); printf("\n");
printf("输入对应的序号进行操作:\n");
printf("创建链表请扣1:\n");
printf("插入数据请扣2:\n");
printf("删除数据请扣3:\n");
printf("合并链表请扣4:\n");
printf("查看链表请扣5:\n");
printf("销毁链表请扣6:\n");
printf("退出请按0:\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: