#include "stdlib.h" #include "stdio.h" typedef int datatype; typedef struct node { datatype data; struct node *next;
}LNode,*LinkList; //建立单链表 LinkList Creat_LinkList() { LinkList l=NULL; LNode *s,*r=NULL; int x; int flag=0; scanf("%d",&x); while(x!=flag) { s=(LNode*)malloc(sizeof(LNode)); s->data=x; if(l==NULL) l=s; else r->next=s; r=s; scanf("%d",&x);
} if(r!=NULL) r->next=NULL; return l;
} //求表长 int Length_LinkList(LinkList l) { LNode *p=l->next; int j; if (p==NULL) return 0; j=1; while(p->next) { p=p->next; j++; } return j; } //查找操作 LNode *Get_LinkList(LinkList l,int i) { LNode *p=l; int j=0; while(p!=NULL&&j<i) { p=p->next; j++;
} if(j==i) return p; else return NULL;
} //插入操作 int Insert_LinkList(LinkList l,int i,datatype x) { LNode *p,*s; p=Get_LinkList(l,i-1); if(p==NULL) { printf("参数i错"); return 0;
} else { s=(LNode*)malloc(sizeof(LNode)); s->data=x; s->next=p->next; p->next=s; return 1; }
} //删除操作 int Del_LinkList(LinkList l,int i) { LNode *p,*s; p=Get_LinkList(l,i-1); if(p==NULL) { printf("第i-1个结点不存在"); return -1;
} else if(p->next==NULL) { printf("第i个结点不存在"); return 0;
} else { s=p->next; p->next=s->next; free(s); return 1;
}
} //单链表逆置 void Reverse_LinkList(LinkList l) { LNode *p,*q; p=l->next; l->next=NULL; while(p) { q=p; p=p->next; p->next=l->next; l->next=q;
}
} //删除重复结点 void pur_LinkList(LinkList l) { LNode *p,*q,*r; p=l->next; while(p&&p->next) { q=p; while(p->next) { if (q->next->data==p->data) { r=q->next; q->next=r->next; free(r);
} else q=q->next ;
}
}
} //单链表的合并 LinkList Merge_LinkList(LinkList a,LinkList b) { LinkList c;LNode *p,*q,*s; p=a->next; q=b->next; c=a; c->next=NULL; free(b); while(p&&q) { if(p->data <q->data) { s=p; p=p->next; } else { s=q; q=q->next;
} s->next=c->next; c->next=s; } if(p==NULL) p=q; while(p) { s=p; p=p->next; s->next=c->next; c->next=s;
} return c; }
//输出单链表 void Print_LinkList(LinkList l) { LNode *p=l; while(p) { printf("%5d",p->data); p=p->next; } printf("\n");
} void main() { LinkList l; int i,j, x; l=(LNode *)malloc(sizeof(LNode)); printf("1--------建立单链表\t\t3-------对单链表进行位置的插入------\n"); printf("2--------求出单链表的长度\t\t4-------删除单链表的某个位置--------\n"); printf("5--------对单链表的逆置\t\t6--------删除重复的结点--------\n"); printf("0---------退出操作-------\n"); printf("请输入的想要的操作:"); scanf("%d",&x); while(x>=0&&x<=5) { switch (x) { case 1: printf("请输入一组数,以0结束\n"); l=Creat_LinkList(); Print_LinkList(l); break; case 2: l=Creat_LinkList(); i=Length_LinkList(l); printf("单链表的长度为:%d",i); break; case 3: l=Creat_LinkList(); printf("请输入你想要插入的位置和数据"); scanf("%d",&i,&x); Insert_LinkList(l,i,x); Print_LinkList(l); break; case 4: l=Creat_LinkList(); printf("请输入你想要删除的位置"); scanf("%d",&i); j=Del_LinkList(l,i); if(j==0) Print_LinkList(l); else if(j==-1) Del_LinkList(l,i); else Del_LinkList(l,i); break; case 5: l=Creat_LinkList(); printf("逆置如下:"); Reverse_LinkList(l); Print_LinkList(l); break; case 0: exit(0); } printf("请继续输入你想完成的操作:"); scanf("%d",&x); }
}