代码改变世界

数据结构作业二(1)

2012-04-10 21:50  璋廊  阅读(220)  评论(0编辑  收藏  举报
/**************
实验二:单链表的基本操作

编写一个完整的程序,实现单链表的建立、插入、删除、输出等基本操作。
(1)建立一个带头结点的单链表。
(2)计算单链表的长度,然后输出单链表。
(3)查找值为x的直接前驱结点q。
(4)删除值为x的结点。
(5)把单向链表中元素逆置(不允许申请新的结点空间)。
(6)利用(1)建立的链表,实现将其分解成两个链表,其中一个全部为奇数
,另一个全部为偶数(尽量利用已知的存储空间)。

****************/
#include<stdio.h>
#include<stdlib.h>
typedef struct point 
{
	int data;
	struct point *next;
}Link,*List;
List built(List head,int n)//建立单链表;
{
	int i,a;
	List h,s,t;
	h=head;
	t=h;
	for(i=0;i<n;i++)
	{
		scanf("%d",&a);
		s=(List)malloc(sizeof(Link));
		s->data=a;
		t->next=s;
		t=s;
	}
	s->next=NULL;
	return h;
}
void print(List head)//输出量表元素:
{
	List p,h;
	h=head;
	p=h->next;
	while(p)
	{
		printf("%d ",p->data);
		p=p->next;
	}
	printf("\n");
}

void Delete(List head,int x)//删除链表中的指定的元素:
{
	List p,q,h;
	h=head;
	p=h->next;
	 while(p)
	 {
		 if(p->data==x)
		 {
			 q=p;
			 h->next=q->next;
			 free(q);
			 break;
		 }
		 h=h->next;
		 p=p->next;
	 }
}
			 
List Inver(List head)//把链表中的元素导致;
{//把指针反向改了;
	List h,p,q,h1;
	//h1=h=(List)malloc(sizeof(Link));
	h1=h=head;
	p=head->next;
	while(p)
	{
		q=p->next;
		p->next=h;
		h=p;
		p=q;
	}
	q=h1->next;
	q->next=NULL;
	h1->next=h;
	return h1;
}

List find(List head)
{
	List h,p,t,s,q;
	h=(List)malloc(sizeof(Link));//奇数的
	t=h;
	p=head->next;
	s=head;
	while(p)
	{
		
		if(p->data%2==1)
		{
			q=p;
			t->next=q;
			s->next=q->next;
			p=p->next;
			t=t->next;
			q->next=NULL;
		}
		else {
			p=p->next;
			s=s->next;
		}
	}
	return h;
}


			

int main()
{
	int n,x;
	List head,h,h1,h2;
	scanf("%d",&n);
	h=(List)malloc(sizeof(Link));
	head=built(h,n);
	printf("新建好的链表!\n");
	print(head);
	printf("删除值为x的节点!\n");
	scanf("%d",&x);
	Delete(head,x);
	printf("删除后的链表!\n");
	print(head);
	printf("将链表逆置!\n");
	 h1=Inver(head);
	print(h1);
	h2=find(head);
	printf("奇数链表!\n");
	print(h2);
	printf("偶数链表!\n");
	print(head);
	return 0;
}