【数据结构-C语言】>根据给定的整型数组,以尾插法建立一个单链表,并实现查找删除插入等操作。

根据给定的整型数组,以尾插法建立一个单链表,并实现以下操作:
① 查找:输入一个欲查找的整数,找到则显示第一个相匹配的整数在单链表中所处的位置,若不存在,则显示提示信息。
② 删除:输入一个欲删除的整数e ,若存在则在单链表中删除第一个值为e 的元素。
③ 插入:输入一个欲插入位置i和欲插入元素e,将e 插入到第i 个整数之前(注意i 的合法性)。

算法源码

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>

typedef struct Node{      //单链表 
	int data;            //结点自身信息 
	struct Node *next;    //后继结点的指针 
}LNode,*LinkList;        //2个类型别名,分别代表链表中的结点、指向结点的指针

/*******创建表长为n的单链表L,n个元素的值存于数组values中*****/




LinkList Creat_LinkList(int *values)  //创建链表并将values数组的数值导入
{
       int i,n;
       LinkList  tail,p;   //创建尾结点和工具结点
       LinkList head=(LinkList)malloc(sizeof(LNode));  //为头结点分配内存
    if (head!=NULL)
      {
        printf("请输入表长n=");scanf("%d",&n) ;
        head->next=NULL;
		tail=head;
            for(i=0;i<n;i++)
               {
				    p=(LinkList)malloc(sizeof(LNode));
			    	p->data=values[i];
                      if(p!=NULL){
						  printf("第%d个元素:%d\n",i+1,p->data); 
					        tail->next=p;
                            tail=p;
                            tail->next=NULL;
					  }   
                        else {
							printf("内存分配失败!");
						          exit(0);}
			} }
    else {
		printf("内存分配失败!");
	          exit(0);}
return head;
}

void insert_LinkList(LinkList head,int i,int e)  //向链表中插入元素
{
	    int j=0;
        LinkList q=head,s;
	while(q!=NULL&&j<i-1){
		q=q->next;
		++j;
                  	}
	if(q==NULL||j>i-1){
		printf("未找到要插入的位置!"); 
	      exit(0);}
	else {s=(LinkList)malloc(sizeof(LNode));
	        if(s==NULL){
	        	printf("内存分配失败!");
		          exit(0);}
			else {s->next=q->next;
			       q->next=s;
			       s->data=e;
			} 
	}
	return;
}

void   traverse_list(LinkList head)  //遍历显示链表中的元素
{
	LinkList p=head->next;
	printf("\n链表的内容为:") ;
	   while(NULL!=p) 
	   {printf("%d ",p->data);
	      p=p->next; 
	   }
	printf("\n\n");
	return;
}


int seek_elem(LinkList head)   //查询链表中的元素位置并返回
{
     int a=0,i=0;
	 LinkList q=head;
  printf("请输入欲查找的整数a=");scanf("%d",&a);
     while(q!=NULL&&q->data!=a)
	 {
	  q=q->next;
        ++i;
	 } 
if(q==NULL)
{
	printf("未查找到整数a!"); 
	exit(0);
}


return i;
}

void  delete_elem(LinkList head)  //删除链表中的元素
{ 
	int e=0;
	LinkList r=head,t;
	printf("请输入欲删除的整数e=");scanf("%d",&e);
	while(r->next!=NULL&&r->next->data!=e)
	{
		r=r->next;
	 } 
	 if(r->next==NULL)
	 {
	 	printf("未找到欲删除的整数!"); 
	 }
	 else
	 {
	 	t=r->next->next;
	 	free(r->next);
	 	r->next=t;
	 
	 }
	 	return;
}



int main(void)
{
    int a=0,n=0,m=0,i=0,e=0;
    int values[100];  //建立数组并输入值
    printf("建立values数组,请输入该数组元素的个数:");scanf("%d",&n);
    printf("请输入各元素:\n");
      for(m=0;m<n;m++)
          scanf("%d",&values[m]); 
	 
      LinkList head=NULL; 
      head=Creat_LinkList(values);
      traverse_list(head);
	  printf("请输入要插入的位置:");scanf("%d",&i);
      printf("请输入要插入的元素:");scanf("%d",&e);
	  insert_LinkList(head,i,e);
	  traverse_list(head);
      delete_elem(head); 
      traverse_list(head);
      a=seek_elem(head);
    printf("该元素在第%d个位置。",a) ;
    return 0;
}

如果有什么问题和疑问,欢迎在评论区留言哦~

发布了33 篇原创文章 · 获赞 7 · 访问量 4563

猜你喜欢

转载自blog.csdn.net/qq_45239614/article/details/102472408
今日推荐