数据结构链表

#include<stdio.h>
#include<malloc.h>
struct node{		//定义一个结构体 
	int data;
	struct node *next;
	};
void input_linklist(struct node *l)		//建立一个名为l的链表 
{
  int i;
  struct node *p1,*p2,*p3;				//定义三个指针 
  p1=(struct node *)malloc(sizeof(struct node));	//为p1开辟一个存储空间 
  p1->data=1;										//为p1赋初始值为1 
  p2=(struct node *)malloc(sizeof(struct node));	//为p2开辟一个存储空间 
  p2->data=1;										//为p2赋初始值为1 
  l->next=p1;										//使空的头节点指向第一个元素 
  p1->next=p2;										//使p1指向第二个元素 
  for(i=3;i<=20;i++)								//使用for循环分别给链表l的二十个元素赋值FIB数列的前20项
  {
      p3=(struct node *)malloc(sizeof(struct node));//为p3开辟一个存储空间 
      p3->data=p1->data+p2->data;					//p3的值为前两项之和 
      p2->next=p3;									//使p2的next域指向p3 
      p1=p2;										//使p1的值为下一项的值以便于后续运算 
      p2=p3;										//使p2的值为下一项的值以便于后续运算 
  }
     p3->next=NULL;									//for循环结束后p3和p2都指向最后一个元素然后使它的next域为NULL 
  }
 void printf_linklist(struct node *l)				//输出链表l的各个元素 
 {
     struct node *p;
     int i=0;
     p=l->next;
     while(p!=NULL)									//只要p不为空就一直循环下去 
     {  if(i%5==0)									//当i等于5使换行输出 
	 	 printf("\n");
		printf("%7d",p->data);						//已7d的格式输出l中的元素 
		p=p->next;
		i++;
	}
 }
int find1(struct node *l,int n)						//查找链表中第7个数据元素的值 
{
   int i=0;											
   struct node *p=l;
   while(p!=NULL)									//当p!=空的时候一直循环 
   {
     if(i==n)										//当i==n时跳出循环 
     break;
     else
     {
       p=p->next;
       i++;
     }
   }
   if(p==NULL)										//当p跳出循环时恒等于NULL时说明链表中没有n那么长否则返回元素值 
   return -1;
   else
   return p->data;
}
int find2(struct node *l,int x)						//查找链表中值为x的元素的编号,如果有该元素,返回它的编号,如果没有返回0。
{
  int i=0;
  struct node *p=l;
  while(p!=NULL)
  {
   if(p->data==x)									//当p->data==x时跳出循环 
     break;
     else
     {
       p=p->next;
       i++;
       }
     }
     if(p==NULL)									//当找不到时返回0否则返回元素的序号 
     return 0;
     else
     return i;
   }
   void del_linklist(struct node *l,int x)			//删除链表中值为x的元素
   {
	struct node *p,*q;
	p=l;
	while(p->next->data!=x)							//当p指向的下一个元素的data值等于x时,删除该元素 
	{
	  p=p->next;
	}
	q=p->next;										//保留要删除的元素 
	p->next=q->next;
	free(q);										//释放q 
   }
  void insert_linklist(struct node *l,int x)		//插入一个值为x的元素,插入后,链表仍保持递增有序 
  {
      struct node *p,*q;
      p=l;
      q=(struct node *)malloc(sizeof(struct node));	//开辟一个存储空间 
      q->data=x;									//把x值放入q 
      while(p!=NULL)
      {
		if(p->data<x && p->next->data>=x)			//查找比x小的前一个元素,比x大的后一个元素 
			break;
		else
			p=p->next;
      }
      q->next=p->next;
      p->next=q;
  }

main()												
{
  struct node *l;
  l=(struct node *)malloc(sizeof(struct node));	//开辟一个链表l 
  l->next=NULL;									//初始化l链表 
  input_linklist(l);
  printf("\n---------------l中的元素------------------\n");
  printf_linklist(l);
  printf("\n---------------l中第7个元素的值------------------\n");
  printf("\n7------%d\n",find1(l,7));
  printf("\n---------------l中第25个元素的值------------------\n");
  printf("\n25-----%d\n",find1(l,25));
  printf("\n---------------l中值为21的元素下标------------------\n");
  printf("\n21-----%d\n",find2(l,21));
  printf("\n---------------l中值为136的元素下标------------------\n");
  printf("\n136----%d\n",find2(l,136));
  del_linklist(l,21);
  printf("\n---------------删除l中值为21的元素------------------\n");
  printf_linklist(l);
  insert_linklist(l,35);
  printf("\n---------------在l中插入一个值为35的元素------------------\n");
  printf_linklist(l);


}


/*
三 实验题目
1 在计算机上建立一个名称为L的链表,带有空的头结点。
2 链表中存放的内容为FIB数列的前20项,一项对应链表中的一个结点。
3 打印链表中所有数据元素的值。
4 查找链表中第7个数据元素的值。
6 查找链表中值为21和136元素的编号,如果有该元素,返回它的编号,如果没有返回0。
7 删除链表中值为21的元素。打印链表。
8 在递增有序的链表中,插入一个值为35的元素,插入后,链表仍保持递增有序。打印链表。
输出: 
      1      1      2      3      5
      8     13     21     34     55
     89    144    233    377    610
    987   1597   2584   4181   6765
7------13

25------1

21-----8

136----0

      1      1      2      3      5
      8     13     34     55     89
    144    233    377    610    987
   1597   2584   4181   6765
      1      1      2      3      5
      8     13     34     35     55
     89    144    233    377    610
    987   1597   2584   4181   6765
*/ 

 

posted @ 2019-09-29 09:45  JackieDYH  阅读(2)  评论(0编辑  收藏  举报  来源