数据结构链表
#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
*/
本文来自博客园,作者:JackieDYH,转载请注明原文链接:https://www.cnblogs.com/JackieDYH/p/17634996.html