#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct Linknode{
ElemType data;
struct Linknode *next;
}LinkNode,*LinkList;
int n;
void menu();
void GreatLinkList(LinkList &L);
void VisitSortLinkList(LinkList &L);
int IsertList(LinkList &L);
int DeleteLinkList(LinkList &L,int s);
void GreatLinkList(LinkList &L)
{
LinkNode *p;
int i;
//p=(LinkList)malloc(sizeof(LinkNode));
//if(p==NULL){
// printf("分配内存失败!\n");
// return;
//}
printf("请输入元素个数:");
scanf("%d",&n);
for(i=1;i<=n;i++){
p=(LinkList)malloc(sizeof(LinkNode));
if(p==NULL){
printf("分配内存失败!\n");
return;
}
printf("倒数第%d个数:",i);
scanf("%d",&p->data);
//p->data=i;
p->next=L->next;
L->next=p;
}
}
void VisitSortLinkList(LinkList &L){
int i,j,temp;
LinkNode *q1;
LinkNode *q2;
if(L->next==NULL){
printf("该表为空!");
return;
}
q1=L;
printf("排序前:");
for(i=1;i<=n;i++)
{
printf("%d ",q1->next->data);
q1=q1->next;
}//遍历该单链表
printf("\n");
for(i=1;i<=n;i++){
q2=L->next;
for(j=1;j<=n-1;j++){
if(q2->data>q2->next->data){
temp=q2->data;
q2->data=q2->next->data;
q2->next->data=temp;
}
q2=q2->next;
}
}//排序该链表
q1=L;
printf("排序后:");
for(i=1;i<=n;i++)
{
printf("%d ",q1->next->data);
q1=q1->next;
}
printf("\n");
}
int IsertList(LinkList &L)
{
LinkNode *p;
LinkNode *q;
LinkNode *t;
int temp,i;
q=L->next;
t=L;
temp=n;
printf("请输入插入的数据:");
p=(LinkList)malloc(sizeof(LinkNode));
if(p==NULL){
printf("分配内存失败!\n");
return 0;
}
scanf("%d",&p->data);
for(i=1;i<=temp;i++){
if(p->data<=q->data){
p->next=q;
t->next=p;
n++;
return 1;
}
q=q->next;
t=t->next;
}
if(i>temp){
p->next=q;
t->next=p;
n++;
return 1;
}
}
int DeleteLinkList(LinkList &L,int s)
{
LinkNode *p;
LinkNode *t;
t=L;
p=L->next;
int i,temp;
temp=n;
if(!L){
printf("该链表为空!\n");
return 0;
}
for(i=1;i<=temp;i++){
if(s==p->data){
t->next=p->next;
p=NULL;
n--;
return 1;
}
t=t->next;
p=p->next;
}
if(i>temp){
return -1;
}
}
void menu()
{
/*clrscr();*/
printf("\n");
printf("\t\t1.创建一个单链表\n\n");
printf("\t\t2.遍历单链表并排序\n\n");
printf("\t\t3.插入单链表\n\n");
printf("\t\t4.删除单链表\n\n");
printf("\t\t5.退出\n\n");
printf("\tplease select:");
}
int main()
{
int x,m=1;
LinkList L;
L=(LinkList)malloc(sizeof(LinkNode));
if(L==NULL){
printf("分配内存失败!\n");
}
L->next=NULL;
while(m)
{
menu();
scanf("%d",&x);
switch(x)
{
case 1:GreatLinkList(L);break;
case 2:VisitSortLinkList(L);break;
case 3:{
LinkNode *p;
int success;
success=IsertList(L);
if(success==1){
p=L;
printf("插入后:");
for(int i=1;i<=n;i++)
{
printf("%d ",p->next->data);
p=p->next;
}
printf("\n");
}
break;
}
case 4:{
LinkNode *p;
int s,success;
printf("请输入要删除的数据:");
scanf("%d",&s);
success=DeleteLinkList(L,s);
if(success==0){
printf("该链表为空!\n");
}
if(success==-1){
printf("对不起,没有该数据\n");
}
if(success==1){
p=L;
printf("删除后:");
for(int i=1;i<=n;i++)
{
printf("%d ",p->next->data);
p=p->next;
}
printf("\n");
}
break;
}
case 5:printf("已释放单链表!");free(L);m=0;
}
}
}
该代码除了简单的增删查改之外,还新增了单链表的排序功能,利用了简单的冒泡排序,方便各位同学做实验进行参考哈哈哈
该代码是本人经过一夜深思熟虑并敲打,有什么不恰当之处欢迎各位大佬指出,不喜勿喷