赞
踩
链表的相关操作作业:
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; // 返回反转后链表的新头结点
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。