mooc数据结构2.1线性表

简单链表的创建、插入、删除、查找的基本操作
要考虑插入和删除要考虑i==1?
要考虑NULL等等

#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define len sizeof(struct node)
typedef struct node* point;
typedef struct node
{
	int data;
	point next;
}List;

int n;
point create()//创建链表 
{ int i=0;
  point head;
  point p1;
  point p2;
  head=NULL;
  p1=(point)malloc(len);
  p2=p1;
  scanf("%d",&p1->data);
  while(p1->data)//假设输入0 则输入结束
  {
	if(i==0)
	head=p1;//第一个新建结点是表头
	else
	p2->next=p1;// 原表尾的下一个结点是新建结点
	p2=p1;//新建结点成为表尾 
	p1=(point)malloc(len);//新建一个结点
	i++;
	scanf("%d",&p1->data);
  }
   free(p1); // 对于num=0的结点,未加入链表,应删除其空间
   p2->next=NULL; //输入结束,表尾结点的下一个结点为空 ,封尾 
   return (head); 
}

void print(point head)//输出链表 
{
	struct node* p;
	p=head;
    while(p!=NULL)
	{
		printf("%d ",p->data);
		p=p->next; 
	}
	
}


int length(point head)//求表长 
{   
	point p=head;
	int j =0;
	while(p)
	{
		p=p->next;
		j++;
	}
	return j;
}


point findkth(point head,int k)//找序号所对应的元素 
{
	point p=head;
	int i=1;
	while(p!=NULL&&i<k)
	{
		p=p->next;
		i++;
	}
	if(i==k)
	return p;
	else
	return NULL;
}



void findx(point head,int x)//按值查找 
{
	point p=head;
	while(p!=NULL)
	{
		if(p->data==x)
		{printf("已找到!\n");
		return;
		}
		else
		p=p->next;
	}
	printf("链表中无此元素!\n");
	return;
}

point Insert(point head,int i,int x)//在第i个点插入 
{
	point p,s;
	if(i==1)//考虑第一个 
	{
		s=(point)malloc(len);
		s->data=x;
		s->next=head;
		return s;
	}
	p=findkth(head,i-1);
	if(p==NULL)
	{
		printf("插入位置错误\n"); 
		return NULL; 
	}
	else
	{  s=(point)malloc(len);
	   s->next=p->next;
	   s->data=x;
	   p->next=s;
	   return head;
	}
 } 


point deleteth(point head,int i)//删除第i位元素
{   point s,p;
    if(i==1)//考虑要删除的元素为第一个 
    {
    	s=head;
    	if(head!=NULL)
    	head=s->next;
		else
		return NULL;
		free(s);
		return head; 
	}
    p=findkth(head,i-1);
	if(p==NULL)
	{
		printf("第%d个节点不存在\n",i);
		return NULL;
	}
	else if(p->next==NULL)
	{
	    printf("第%d个节点不存在\n",i);
		return NULL;
	}
	else
	{
	s=(point)malloc(len);
	s=p->next;
	p->next=s->next;
	free(s);
	return head;
	}
	
} 




int main()
{   int i,x;
    char c;
    point head;
    printf("1.链表的创建\n"); 
    printf("2.链表元素的插入\n");
	printf("3.链表元素的删除\n");
	printf("4.链表的查找\n");
	printf("5.显示链表\n"); 
	printf("6.退出\n");
	while(1)
	{
		printf("\n请输入数字!\n");
		scanf("%s",&c);
		switch(c)
		{ 
		case '1':head=create();break;
	 	case '2':printf("请输入需要插入的位置和值,输入0 则为输入结束\n");
	 	         scanf("%d %d",&i,&x);
		         head=Insert(head,i,x);break;
	 	case '3':printf("请输入需要删除的位置\n");
	 	         scanf("%d",&i);
		         head=deleteth(head,i);break;
    	case '4':printf("请输入需要查找的值\n");
		        scanf("%d",&x);
				findx(head,x);break;
	 	case '5':print(head);break; 
	 	case '6':printf("使用结束!");exit(0); 
	 	default:exit(1);
		}
		 
		
	}
	return 0;
	
 } 

猜你喜欢

转载自blog.csdn.net/weixin_43913556/article/details/86929271