7.23数据结构——单链表
文章目录
- 一、思维导图
- 二、单链表代码
-
- head.h
- text.c
- main.c
- 现象
一、思维导图
二、单链表代码
head.h
#ifndef __HEAD_H__#define __HEAD_H__#include #include #include enum A{FAULSE=-1,//失败返回SUCCESS//成功返回};//给普通节点的数据域类型起别名typedef int datatype;//定义节点的结构体typedef struct Node{//数据域union{datatype data;//普通元素的数据域int len;//头结点的数据元素:数据长度};//指针域:存储下一个节点的地址struct Node *next;}*linklist;//单链表的节点创建linklist creat_node(int flag);//头插int insert_head(linklist head,datatype element);//输出int output(linklist head);//尾插int insert_end(linklist head,datatype element);//头删int delate_head(linklist head);//尾删int delate_end(linklist head);//按位置查找int search_place(linklist head,int place);//按位置删除int delate_place(linklist head,int place);//按位置插入int insert_place(linklist head,int place,datatype element);//按位置修改int change_place(linklist head,int place,datatype element);//按元素查找int search_number(linklist head,datatype element);//按元素修改int change_number(linklist head,datatype element,datatype number);//按元素删除int delate_number(linklist head,datatype element);//逆置int reverse(linklist head);//找倒数第n个节点int find_n(linklist head,int n);//单链表释放内存int my_free(linklist head);//单链表排序int bubble(linklist head);#endif
text.c
#include \"head.h\"//单链表的节点创建linklist creat_node(int flag){linklist s=(linklist)malloc(sizeof(struct Node));if(s==NULL){return NULL;}//内存申请成功//flag==1给头结点初始化if(flag==1){s->len=0;}//flag==0给普通节点初始化else if(flag==0){s->data==0;}//初始化指针域s->next=NULL;return s;}//头插int insert_head(linklist head,datatype element){//判断头结点是否存在if(head==NULL){return FAULSE;}//创建节点linklist s=creat_node(0);if(s==NULL){return FAULSE;}//节点创建成功s->data=element;//对新节点的数据域赋值//插入新节点s->next=head->next;head->next=s;//链表长度加1head->len++;return SUCCESS;}//输出int output(linklist head){//判断head是否为null//判断内容是否为空if(head==NULL||head->len==0){return FAULSE;}linklist L=head;/*for(int i=0;ilen;i++){printf(\"%d \",L->next->data);L=L->next;}*/while(L->next!=NULL){printf(\"%d \",L->next->data);L=L->next;}putchar(10);return SUCCESS;}//尾插int insert_end(linklist head,datatype element){//判断头结点是否存在if(head==NULL){return FAULSE;}linklist end=head;while(end->next!=NULL)//寻找尾节点{end=end->next;}//创建尾节点linklist s=creat_node(0);//输入尾节点的值s->data=element;//让尾节点指向新的尾节点end->next=s;head->len++;return SUCCESS;}//头删int delate_head(linklist head){//判断头结点是否存在//判断头结点是否为空if(head==NULL||head->next==NULL){return FAULSE;}//标记要删除的节点linklist index=head->next;//让头结点指向要删除节点的下一个节点head->next=index->next;//释放删除节点的内存free(index);//防止野指针index=NULL;head->len--;return SUCCESS;}//尾删int delate_end(linklist head){if(head==NULL||head->next==NULL){return FAULSE;}//定义尾节点的上一个节点linklist index=head;while(index->next->next!=NULL){index=index->next;}//删除尾节点free(index->next);index->next=NULL;head->len--;return SUCCESS;}//按位置查找int search_place(linklist head,int place){//判断头结点是否存在//判断位置是否合法if(head==NULL||place<1||place>head->len){return FAULSE;}linklist p=head;for(int i=0;i<place;i++){p=p->next;}printf(\"第%d个元素的数值为%d\\n\",place,p->data);return SUCCESS;}//按位置删除int delate_place(linklist head,int place){//判断头结点是否存在//判断位置是否合法if(head==NULL||place<1||place>head->len){return FAULSE;}linklist p=head;for(int i=0;i<place-1;i++){p=p->next;}linklist L=p->next;p->next=L->next;free(L);L->next=NULL;head->len--;return SUCCESS;}//按位置插入int insert_place(linklist head,int place,datatype element){//判断头结点是否存在//判断位置是否合法if(head==NULL||place<1||place>head->len+1){return FAULSE;}//寻找插入节点前一个节点linklist p=head;for(int i=0;i<place-1;i++){p=p->next;}//创建节点linklist L=creat_node(0);if(L==NULL)return FAULSE;//传值L->data=element;L->next=p->next;p->next=L;head->len++;return SUCCESS;}//按位置修改int change_place(linklist head,int place,datatype element){//判断头结点是否存在//判断位置是否合法if(head==NULL||place<1||place>head->len){return FAULSE;}linklist p=head;for(int i=0;i<place;i++){p=p->next;}p->data=element;return SUCCESS;}//按元素查找int search_number(linklist head,datatype element){//判断节点是否存在if(head==NULL){return FAULSE;}linklist p=head;int pos=0;while(p!=NULL){if(p->data==element){return pos;}pos++;p=p->next;}return FAULSE;}//按元素修改int change_number(linklist head,datatype element,datatype number){int pos=search_number(head,element);if(pos==FAULSE)return FAULSE;change_place(head,pos,number);return SUCCESS;}//按元素删除int delate_number(linklist head,datatype element){int pos=search_number(head,element);if(pos==FAULSE)return FAULSE;delate_place(head,pos);return SUCCESS;}//逆置int reverse(linklist head){//判断头结点是否存在//判断其他节点是0个或1个if(NULL==head||head->len<=1){return FAULSE;}//逆置linklist p=head->next;head->next=NULL;for(int i=0;i<head->len;i++){linklist temp=p;p=p->next;//把temp头插temp->next=head->next;head->next=temp;}return SUCCESS;}//找倒数第n个节点int find_n(linklist head,int n){if(head==NULL||n<1||n>head->len){return FAULSE;}linklist p=head;linklist q=head;for(int i=0;i<n;i++){q=q->next;}while(q!=NULL){p=p->next;q=q->next;}printf(\"倒数第%d个节点的值为%d\\n\",n,p->data);return SUCCESS;}//单链表释放内存int my_free(linklist head){if(head==NULL){return FAULSE;}int len=head->len;for(int i=0;i<len;i++){delate_end(head);}free(head);}//单链表排序int bubble(linklist head){if(NULL==head||head->len<=1){return FAULSE;}for(int i=0;i<head->len-1;i++){int flag=0;linklist p=head->next;for(int j=0;j<head->len-1-i;j++){if(p->data>p->next->data){datatype temp=p->data;p->data=p->next->data;p->next->data=temp;flag=1;}p=p->next;}if(flag==0){break;}}return SUCCESS;}
main.c
#include \"head.h\"int main(int argc, const char *argv[]){//创建头结点linklist head=creat_node(1);//头插insert_head(head,15);insert_head(head,13);insert_head(head,12);insert_head(head,21);insert_head(head,19);insert_head(head,12);insert_head(head,54);insert_head(head,14);printf(\"头插后的结果:\\n\");output(head);//尾插insert_end(head,11);printf(\"尾插后的结果:\\n\");output(head);//按位置删除delate_place(head,3);printf(\"按位置删除后的结果:\\n\");output(head);//按位置查找search_place(head,2);//头删delate_head(head);printf(\"头删后的结果:\\n\");output(head);//按位置插入insert_place(head,2,14);printf(\"按位置插入的结果:\\n\");output(head);//按位置修改change_place(head,2,98);printf(\"按位置修改后的结果:\\n\");output(head);//尾删delate_end(head);printf(\"按尾删后的结果:\\n\");output(head);//逆置reverse(head);printf(\"逆置后的结果:\\n\");output(head);//按元素查找int pos=search_number(head,13);printf(\"查找到元素为第%d个\\n\",pos);//按元素修改change_number(head,15,99);printf(\"按元素修改后的结果:\\n\");output(head);//按元素删除delate_number(head,54);printf(\"按元素删除后的结果:\\n\");output(head);//找倒数第n个节点find_n(head,2);//单链表排序bubble(head);printf(\"排序之后的结果:\\n\");//输出output(head);//单链表释放内存my_free(head);head=NULL;return 0;}
现象
头插后的结果:
14 54 12 19 21 12 13 15
尾插后的结果:
14 54 12 19 21 12 13 15 11
按位置删除后的结果:
14 54 19 21 12 13 15 11
第2个元素的数值为54
头删后的结果:
54 19 21 12 13 15 11
按位置插入的结果:
54 14 19 21 12 13 15 11
按位置修改后的结果:
54 98 19 21 12 13 15 11
按尾删后的结果:
54 98 19 21 12 13 15
逆置后的结果:
15 13 12 21 19 98 54
查找到元素为第2个
按元素修改后的结果:
99 13 12 21 19 98 54
按元素删除后的结果:
99 13 12 21 19 98
倒数第2个节点的值为19
排序之后的结果:
12 13 19 21 98 99