链表的相关操作作业:
1】 按值修改
2】按值查找,返回当前节点的地址 (先不考虑重复,如果有重复,返回第一个)
3】 逆置(反转)
4】释放链表
main.c
#include "head.h"int main(int argc, const char *argv[])
{//创建链表,头结点linklist_ptr p=create();//判断链表是否为空empty(p);//头插insert_head(p,10);insert_head(p,11);insert_head(p,12);//输出output(p);//尾插insert_tail(p,1);insert_tail(p,2);insert_tail(p,3);output(p);//任意位置插入insert_index(p,2,99);output(p);//头删del_head(p);output(p);//尾删除 del_tail(p);output(p);//任意位置删除del_index(p,2);output(p);//按照所给位数修改值change_element(p,1,99);output(p);//按照所给的值查找find_element(p,1);output(p);//反转reversal(p);output(p);return 0;
}
head.h
#include <stdio.h>
#include <stdlib.h>
//定义节点数据的类型
typedef int datatype;
//定义链表结构体
typedef struct node
{ union { //表示节点的个数 int len; //节点的数据 datatype data; }; //指针域 struct node *next;
}linklist,*linklist_ptr; //1.链表的创建
linklist_ptr create();
//2.判断链表是否为空
int empty(linklist_ptr p);
//3.申请节点封装数据
linklist_ptr node_create(datatype e);
//4.头插
int insert_head(linklist_ptr p,datatype e);
//5.输出
void output(linklist_ptr p);
//6.尾插
int insert_tail(linklist_ptr p,datatype e);
//7.任意位置插入
int insert_index(linklist_ptr p,int index,datatype e);
//8.头删
int del_head(linklist_ptr p);
//9.尾删除
int del_tail(linklist_ptr p);
//10.任意位置删除
int del_index(linklist_ptr p,int index);
//11.按照所给的值修改
int change_element(linklist_ptr p,int index,datatype e);
//12.按照所给的值查找
linklist_ptr find_element(linklist_ptr p,datatype e);
//13.反转
int reversal(linklist_ptr p);
#endif
fun.c
{ q=q->next; } q->next=p1; p->len++; return 1;
} //7.任意位置插入
int insert_index(linklist_ptr p,int index,datatype e)
{ if(NULL==p || index<1 || index>p->len+1) { printf("尾插失败\n"); return -1; } //申请节点 linklist_ptr p1=node_create(e); linklist_ptr q=p; for(int i=0;i<index;i++) { q=q->next; } p1->next=q->next; q->next=p1; p->len++; return 1;
} //8.头删
int del_head(linklist_ptr p)
{ if(NULL==p || empty(p)) { printf("头删失败\n"); } //定义一个指针指向头指针指向的节点 linklist_ptr p1=p->next; p->next=p1->next; free(p1); p1=NULL; p->len--; return 1; } //9.尾删除
int del_tail(linklist_ptr p)
{ if(NULL==p || empty(p)) { printf("尾删失败\n"); return 0; } //定义一个指针指向头结点并让其循环到最后一个节点的前一个节点 linklist_ptr p1=p; for(int i=0;i<p->len-1;i++) { p1=p1->next; } //指向需要删除最后一个节点 linklist_ptr p2=p1->next; p1->next=p1->next; //释放 free(p2); p2=NULL; p->len--; return 1;
} //10.任意位置删除
int del_index(linklist_ptr p,int index)
{ if(NULL==p || empty(p) || index>p->len ||index<0) { printf("任意位置删除失败\n"); return 0; } //定义一个指针指向头结点用于循环到所需要 //的位置的上一个节点 linklist_ptr p1=p; for(int i=0;i<index-1;i++) { p1=p1->next; } //定义一个指针指向需要被删除的节点 linklist_ptr p2=p1->next; p1->next=p2->next; //释放 free(p2); p2=NULL; p->len--; return 1;
} //11.按照所给的值修改
int change_element(linklist_ptr p,int index,datatype e)
{ if(NULL==p || empty(p) || index>p->len || index<0) { printf("任意位置修改失败\n"); return 0; } //定义一个指针找到所需要的修改的节点 linklist_ptr p1=p; for(int i=0;i<index;i++) { p1=p1->next; } //修改其中的值 p1->data=e; } //12.按照所给的值查找
linklist_ptr find_element(linklist_ptr p,datatype e)
{ if(NULL==p || empty(p)) { printf("查找值失败\n"); return NULL; } //记录相同的次数 int flag=0; //循环查找 linklist_ptr p1=p; for(int i=0;i<p->len;i++) { p1=p1->next; if(p1->data==e) { printf("第%d个元素的值相等\n",i+1); flag++; } if(flag==1) { return p1; } } if(flag==0) { printf("未查找到相应的值\n"); } return p;
} //13.反转
int reversal(linklist_ptr p)
{ if(NULL == p || empty(p)) { printf("反转失败\n"); return 0; } linklist_ptr p1 = p->next; // 保存第1个节点的地址 p->next = NULL; // 断开原头结点的连接(使其成为反转后的链表的尾节点) linklist_ptr p2; while(p1->next!=NULL) { p2 = p1; // 将当前节点保存到p2,以便将其插入到头部 p1 = p1->next; // 移动到下一个节点 p2->next = p->next; // 将p2插入到p之前(使p2成为新的头结点) p->next = p2; // 更新p为新插入的节点(更新头结点) } return 1; // 返回反转后链表的新头结点
}