数据结构实验 单链表 (二)

2014-11-24 01:07:56 · 作者: · 浏览: 13
ext;
if(s==NULL)
return ;
temp=-1;
while(s!=NULL)
{
e=s->next;
if(s->data==temp)
{
free(s);
r->next=e;
}
else
{
temp=s->data;
r=s;
}
s=e;
}
return ;
}
void Cutlist()//分拆链表。
{
node *s,*s1,*e1,*s2,*e2;
h1=(node *)malloc(sizeof(node));
s1=(node *)malloc(sizeof(node));
h2=(node *)malloc(sizeof(node));
s2=(node *)malloc(sizeof(node));
e1=h1;
e1->next=NULL;
e2=h2;
e2->next=NULL;
s=h->next;
while(s!=NULL)
{
if(s->data%2!=0)
{
s1->data=s->data;
e1->next=s1;
e1=s1;
e1->next=NULL;
s1=(node *)malloc(sizeof(node));
}
else
{
s2->data=s->data;
e2->next=s2;
e2=s2;
e2->next=NULL;
s2=(node *)malloc(sizeof(node));
}
s=s->next;//第一次写的时候没有加上这一句,电脑直接就卡死了。。。。
}
Printlist(h1);
Printlist(h2);
return ;
}
int Opra()
{
int T;
printf("*****************目录******************\n");
printf("创建一个单链表: 1\n");
printf("计算单链表长度并输出单链表: 2\n");
printf("查找值为x的前驱结点: 3\n");
printf("删除值为x的结点: 4\n");
printf("把单链表中的元素逆置: 5\n");
printf("删除单链表中值在x和y之间的元素: 6\n");
printf("删除链表中值相同的元素: 7\n");
printf("将链表分成两部分: 8\n");
printf("操作结束: 0\n");
printf("输入操作代号: ");
scanf("%d",&T);
switch(T)
{
case 1:Creatlist();break;
case 2:Printlist(h);break;
case 3:Findlist(); break;
case 4:Deletlist();break;
case 5:Inverlist();break;
case 6:Delexylist();break;
case 7:DeleSamelist();break;
case 8:Cutlist();break;
case 0:return 0;
default :printf("输入错误,请重新输入!\n");break;
}
return 1;
}
int main()
{
int flag=1;
while(1)
{
flag=Opra();
if(!flag)//用flag控制是否跳出循环。
break;
printf("\n\n");
}
printf("谢谢使用!\n");
return 0;
}

//因为没有要求输入的链表数据的数量,所以我用-1表示输入结束。
//测试数据 1 2 3 4 5 6 -1
//测试删除相同元素的数据 2 2 3 3 4 4 5 5
#include
#include
struct node
{
int data;
node *next;
};
node *h,*h1,*h2;
void Creatlist()//创建链表
{
node *s,*e;
h=(node *)malloc(sizeof(node));
s=(node *)malloc(sizeof(node));
h->next=s;
printf("请输入单链表数据: ");
scanf("%d",&s->data);
e=h;
while(s->data!=-1)//用-1表示链表输入终止
{
e=s;
s=(node *)malloc(sizeof(node));
scanf("%d",&s->data);
e->next=s;
}
e->next=NULL;
return ;
}
void Printlist(node *h)//输出链表
{
int count;
node *s;
s=h;
count=0;
while(s->next!=NULL)//先遍历一遍,用count记录链表的长度。
{
count++;
s=s->next;
}
printf("单链表长度: %d\n",count);
if(count==0)
{
printf("链表为空!\n");
return ;
}
printf("单链表数据: ");
s=h;
while(s->next!=NULL)
{
s=s->next;
printf("%d ",s->data);
}
printf("\n");
return ;
}
void Findlist()//查找值为x的前驱结点
{
int x;
node *s,*e;
printf("请输入待查找的数值: ");
scanf("%d",&x);
s=h->next;
if(s->data==x)
{
printf("%d没有前驱结点!\n",x);//x为第一个结点
return ;
}
e