单链表的操作练习

代码

//链表 
//带头结点 
#include<stdio.h>
#include<stdlib.h>
struct ListElement
{
	int num;
	//char name[10];
	ListElement *next;	
};
typedef struct ListElement node;
typedef node* link;

//从表头插入新节点,返回表头指针 
link creatHead()
{
	link head=(link)malloc(sizeof(node));
	link p,q;
	q=head->next=NULL;
	printf("==================从表头插入节点==============\n");
	char ch='*';
	printf("输入链表数据,以#结束\n");
	int tem;
	while('#'!=ch)
	{
		scanf("%d",&tem);
		
		p=(link)malloc(sizeof(node));
		p->num=tem;
		head->next=p;
		p->next=q;
		q=p;
		ch=getchar();//输入数字之间的空格或回车或结束符#赋给ch; 
	}
	return(head);		
} 
//从表尾插入节点
link creatTail()
{
	link head=(link)malloc(sizeof(node));
	link p,q;
	q=head;
	printf("==================从表尾插入节点==============\n");
	char ch='*';
	printf("输入链表数据,以#结束\n");
	int tem;
	while('#'!=ch)
	{
		scanf("%d",&tem);
		
		p=(link)malloc(sizeof(node));
		p->num=tem;
		q->next=p;
		q=p;
		ch=getchar();//输入数字之间的空格或回车或结束符#赋给ch; 
	}
	q->next=NULL;
	return(head);			
}
//获取链表的节点数 
int getLen(link head)
{
	int j=0;
	link p=head->next;
	while(p)
	j++;
}

void show(link head)
{
	link p=head->next;//!!!空出头节点 
	while(p)
	{
		printf("%4d",p->num);
		p=p->next;
	}
	printf("\n");
}
//按位置i查找
//返回指向位置i指针 
 
link find(link head , int i)//暂不考虑i超出合理范围 ,否则用getLen()函数; 
{
	link p=head->next;
	int j=1;
	while(p&&(j++<i))
		p=p->next;
	return p;
}

//按值查找 
//找到则输出指向该节点的指针 
int Locate(link head, int x)
{
	int i=1;
	link p=head->next;
	while(p&&(x!=p->num))
		{
			p=p->next;i++; 
		}
	if(p)return i;
	else return -1;

}

//插入节点 
//在给定节点*q之后
//
int InsList(link q, int x)
{
	link p;
	if(p=(link)malloc(sizeof(node)))
	{
		p->num=x;
		p->next=q->next;
		q->next=p;
		return 1;
	}
	else return -1;				
} 
//删除头指针head的链表(所有出现的)元素X 
void DelList(link head, int x)
{
	link p=head->next;
	link q=head;
	while(p)
	{
		while(p&&(x!=p->num))//p的条件不能省 
		{
			p=p->next;
			q=q->next;	
		}
		q->next=p->next;
		free(p);
		if(p)
			p=q->next; 
	}
	/*if(!p)
	{
		printf("没找到元素%d.\n",x);
		return -1;
	}*/	
	 	
}
int main()
{
	printf("===========a1===========\n");	
	link a1=creatHead();
	show(a1);	
	printf("===========a2===========\n");
	link a2=creatTail();
	show(a2);
	printf("为查找a2第i位置的元素,输入i:\n");
	int tem;
	scanf("%d",&tem); 
	printf("查得位置%d的元素是%d.\n",tem,find(a2,tem)->num);
	printf("===============================================\n");
	printf("为判断a2是否含元素x,输入x:\n");
	int x,y;
	scanf("%d",&x);
	if(-1==(y=Locate(a2,x)))
		printf("a2不含元素%d\n",x);
	else 
		printf("元素%d位于a2位置%d处.\n",x,y);
	printf("===============================================\n");
	printf("a2第m个位置后插入n个元素,输入(m,n):\n");
	int m,n;
	scanf("%d%d",&m,&n);
	printf("输入这%d个元素:\n",n);
	
	int pnum=0;
	link pp=a2;
	do 
	{
		pp=pp->next;
		pnum++;	
	}while(pnum<m);
	

	int u,e;	
	for(u=1;u<=n;u++)
	{
		scanf("%d",&e);
		InsList(pp,e);
		pp=pp->next;		
	}
	printf("修改后的a2: \n");
	show(a2);
	printf("===============================================\n");
	printf("a2中,输入要删除的元素值:\n");
	int numlast;
	scanf("%d",&numlast);
	DelList(a2,numlast);
	printf("修改后的a2: \n");
	show(a2); 
	
 	return 0;
}

运行结果

猜你喜欢

转载自blog.csdn.net/lituusliu/article/details/77284844
今日推荐