嵌入式学习-数据结构-Day4
一、思维导图
二、作业
1.单向链表任意元素查找
2.单向链表任意元素修改
3.单向链表任意元素删除
4.单向链表逆置
5.单向链表查找倒数第n个节点
6.单向链表排序
7.单向链表释放内存
主函数部分
#include "head.h"
int main(int argc, const char *argv[])
{
Linklist head=NULL;//定义 头指针
datatype element,element1;
int n,pos;
printf("please enter n:");
scanf("%d",&n);
for(int i=0;i<n;i++)
{
printf("please enter %d element:",i+1);
scanf("%d",&element);
//head=insert_head(head,element); //头插
head=insert_rear(head,element); //尾插
}
Output(head);
// head=del_head(head); //头删
// Output(head);
// head=del_rear(head); //尾删
// Output(head);
/* printf("please enter insert pos:");//根据位置插入
scanf("%d",&pos);
printf("please enter insert element:");
scanf("%d",&element);
head=insert_pos(head,pos,element);
Output(head);
printf("please enter delete pos:");//根据位置删除
scanf("%d",&pos);
head=del_pos(head,pos);
Output(head);
printf("please enter find pos:");//根据位置查找
scanf("%d",&pos);
find_pos(head,pos);
printf("please enter change pos:");//根据位置查找修改
scanf("%d",&pos);
printf("please enter chang element:");
scanf("%d",&element);
change_pos(head,pos,element);
Output(head);
*/
printf("please enter find element:");//根据元素查找
scanf("%d",&element);
find_element(head,element);
printf("please enter change element:");//根据元素查找修改
scanf("%d",&element);
printf("please enter chang element:");
scanf("%d",&element1);
change_element(head,element,element1);
printf("please enter delete element:");//根据元素查找删除
scanf("%d",&element);
head=del_element(head,element);
head=reverse_list(head); //链表逆置
printf("please enter the pos from back:");//查找倒数第n个节点
scanf("%d",&pos);
find_back_pos(head,pos);
Bubble(head);//冒泡排序
head=free_space(head);//释放内存
return 0;
}
相关函数
#include "head.h"
//创建节点
Linklist create_node()
{
Linklist p=(Linklist)malloc(sizeof(struct Node));
if(NULL==p)
return NULL;
p->data=0; //数据域和指针域要初始化
p->next=NULL;
return p;
}
//头插
Linklist insert_head(Linklist head ,datatype element)
{
Linklist s=create_node(); //创建节点s
if(NULL==s)
return head;
s->data=element;
s->next=head;
head=s; //将head换到s位置,逆序
return head; //返回head
}
//尾插
Linklist insert_rear(Linklist head,datatype element)
{
Linklist s=create_node(); //创建节点
s->data=element;
if(head==NULL)
head=s;
else
{
Linklist p=head;
while(p->next!=NULL)//找到最后一个节点
p=p->next;
p->next=s; //连接s 正序
}
return head;
}
//头删
Linklist del_head(Linklist head)
{
if(NULL==head)
return head;
//printf("delete from head\n");
Linklist del=head;
head=head->next;
free(del);
del=NULL;
return head;
}
//尾删
Linklist del_rear(Linklist head)
{
if(NULL==head)
return head;
else if(head->next==NULL)//只有一个长度
{
free(head);
head=NULL;
return head;
}
else
{
Linklist p=head;
while(p->next->next!=NULL)
p=p->next;
free(p->next);
p->next=NULL;
return head;
}
}
//输出
void Output(Linklist head)
{
if(NULL==head)
{
printf("Linklist is EMPTY\n");
return;
}
Linklist p=head;
printf("the Output is: ");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
puts("");
}
//计算长度
int len_linklist(Linklist head)
{
if(NULL==head)
{
printf("LEN IS ZERO\n");
return FALSE;
}
Linklist p=head;
int count=0;
while(p!=NULL)
{
p=p->next;
count++;
}
return count;
}
//根据位置插入***
Linklist insert_pos(Linklist head,int pos,datatype element)
{
if(pos<1||pos>len_linklist(head)+1)//在len位置和len+1位置都可以插入
{
puts("ERROR\n");
return head;
}
if(pos==1)
{
head=insert_head(head,element); // 调用头插
return head;
}
Linklist p=head;
for(int i=1;i<pos-1;i++)
p=p->next;
Linklist s=create_node();
if(NULL==s)
return head;
s->data=element; //存储数据
s->next=p->next; //插入
p->next=s;
return head;
}
//根据位置删除***
Linklist del_pos(Linklist head,int pos)
{
if(NULL==head||pos<1||pos>len_linklist(head))
return head;
if(pos==1) //第一个位置头删
head=del_head(head);
else //不是第一个位置
{
Linklist p=head;
for(int i=1;i<pos-1;i++) //找到pos-1
p=p->next;
Linklist del=p->next; //找到删除位置
p->next=del->next; //连接
free(del);
del=NULL;
return head;
}
}
//根据位置查找
void find_pos(Linklist head,int pos)
{
if(NULL==head||pos<1||pos>len_linklist(head))
{
puts("ERROR\n");
return;
}
Linklist p=head;
for(int i=1;i<pos;i++)
{
p=p->next;
}
printf("find:%d\n",p->data);
}
//根据位置查找修改
void change_pos(Linklist head,int pos,datatype element)
{
if(NULL==head||pos<1||pos>len_linklist(head))
{
puts("ERROR\n");
return;
}
Linklist p=head;
for(int i=1;i<pos;i++)
{
p=p->next;
}
p->data=element;
}
//根据元素查找 输出下标
void find_element(Linklist head,datatype element)
{
if(NULL==head)
return;
Linklist p=head;
int count=1,flag=0;
while(p!=NULL)
{
if(p->data==element)
{
flag=1;
printf("find SUCCESS! index is %d\n",count);
}
count++;
p=p->next;
}
if(flag==0)
printf("element is NOT EXIST\n");
}
//根据元素查找修改
void change_element(Linklist head,datatype element,datatype element1)
{
if(NULL==head)
return;
Linklist p=head;
int flag=0;
while(p!=NULL)
{
if(p->data==element)
{
flag=1;
p->data=element1;
}
p=p->next;
}
if(flag==1)
{
printf("modify SUCCESS\n");
Output(head);
}
if(flag==0)
printf("modify FAIL\n");
}
//根据元素查找删除 (删不掉重复)
Linklist del_element(Linklist head,datatype element)
{
if(NULL==head)
return head;
Linklist p=head;
int flag=0,pos=1;
while(p!=NULL)
{
if(p->data==element)
{
flag=1;
head=del_pos(head,pos);
}
p=p->next;
pos++;
}
if(flag==0)
printf("element NOT EXIST\n");
if(flag==1)
Output(head);
return head;
}
//***链表逆置***
Linklist reverse_list(Linklist head)
{
if(NULL==head)
return head;
if(head->next==NULL)
{
printf("element only one\n");
return head;
}
Linklist p;
p=head->next;
head->next=NULL; //断开头
while(p != NULL )
{
Linklist t=p;//利用t连接断开的head***
p=p->next;//p前进
t->next=head;
head=t;//把head给t
}
printf("reverse!\n");
Output(head);
return head;
}
//查找倒数第n个节点
void find_back_pos(Linklist head,int pos)
{
int len=len_linklist(head);
if(NULL==head||pos<0||pos>len)
return;
Linklist p,q;//定义两个变量
p=q=head;
for(int i=0;i<pos;i++)
p=p->next;
while(p!=NULL)
{
p=p->next;
q=q->next;
}
printf("element is %d\n",q->data);
}
//链表排序-冒泡
void Bubble(Linklist head)
{
if(NULL==head)
return;
Linklist p=head;
int len=len_linklist(head);
for(int i=1;i<len;i++)
{
p=head;// p从头开始
for(int j=0;j<len-i;j++)
{
if(p->data > p->next->data)
{
datatype t=p->data;
p->data=p->next->data;
p->next->data=t;
}
p=p->next;//p前进
}
}
printf("bubble\n");
Output(head);
}
/*链表排序-简单选择
void easyselect(Linklist head)
{
}*/
//释放内存
Linklist free_space(Linklist head)
{
if(NULL==head)
return NULL;
while(head!=NULL)
head=del_head(head);
return head;
}
//删除元素(删重复)
void del2_element(Linklist head,datatype element)
{
if(NULL==head)
return;
Linklist p=head;
Linklist q=head;
int flag=0,pos=1,flag1=0;
while(p!=NULL)
{
flag1=0;
if(p->data==element)
{
flag=1;
flag1=1;
head=del_pos(head,pos);
for(int i=0;i<pos-1;i++)
q=q->next;
}
if(flag1==1)
{p=q;}
else
{p=p->next;pos++;}
}
if(flag==0)
printf("element NOT EXIST\n");
if(flag==1)
Output(head);
}
头文件
#ifndef __HEAD_H__
#define __HEAD_H__
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
enum{FALSE=-1,SUCCESS};
typedef int datatype;
typedef struct Node //创建节点结构体
{
datatype data;//数据域
struct Node *next;//指针域
}*Linklist;
Linklist create_node();
Linklist insert_head(Linklist head ,datatype element);
void Output(Linklist head);
Linklist insert_rear(Linklist head,datatype element);
Linklist del_head(Linklist head);
Linklist del_rear(Linklist head);
int len_linklist(Linklist head);
Linklist insert_pos(Linklist head,int pos,datatype element);
Linklist del_pos(Linklist head,int pos);
void find_pos(Linklist head,int pos);
void change_pos(Linklist head,int pos,datatype element);
void find_element(Linklist head,datatype element);// 以下是作业所用的函数
void change_element(Linklist head,datatype element,datatype element1);
Linklist del_element(Linklist head,datatype element);
Linklist reverse_list(Linklist head);
void find_back_pos(Linklist head,int pos);
void Bubble(Linklist head);
Linklist free_space(Linklist head);
#endif
运行结果