C语言实现单链表的头插、尾插、删除、插入、查询操作

效果图

C语言实现单链表的头插、尾插、删除、插入、查询操作

 

编译工具:

C语言实现单链表的头插、尾插、删除、插入、查询操作

 

代码:

#pragma clang diagnostic push
#pragma ide diagnostic ignored "cert-err34-c"
/*********************************************
 * 单链表的实现
 ********************************************/
#include <stdio.h>
#include <stdlib.h>
//定义别名
typedef int ElementType;
//定义结点类型结构体,起别名为LNode,*LinkList也是别名,他是指向链表的指针
typedef struct LNode {
 ElementType data;
 struct LNode *next;
} LNode, *LinkList;
/**
 * 函数声明
 */
LinkList List_heardInsert(LinkList L);
LinkList List_ailInsert(LinkList L);
LinkList GetElementByPosition(LinkList L, int position);
LinkList GetElementByValue(LinkList L, ElementType e);
void InsertElement(LinkList L, int position, ElementType e);
void printLinkList(LinkList L);
void DeleteElement(LinkList L,int position);
int Length(LinkList L);
void printMenu();
//主函数
int main() {
 int token, position, element;
 LinkList L = NULL;
 printMenu();
 scanf("%d", &token);
 while (token != 0) {
 if (token == 1) {
 L = List_heardInsert(L);
 }
 if (token == 2) {
 L = List_ailInsert(L);
 }
 if (token == 3) {
 printLinkList(L);
 }
 if (token == 4) {
 printf("请输入要查找的位置\n");
 scanf("%d", &position);
 LNode *node = GetElementByPosition(L, position);
 printf("第%d位的元素值位%d\n", position, node->data);
 }
 if (token == 5) {
 printf("请输入要查找的元素值\n");
 scanf("%d", &element);
 LNode *node = GetElementByValue(L, element);
 if (node != NULL) {
 printf("按值查找成功,其值为%d\n", node->data);
 } else {
 printf("没有找到相应的值\n");
 }
 }
 if (token == 6) {
 printf("请输入要插入的元素值\n");
 scanf("%d", &element);
 printf("请输入要插入的位置\n");
 scanf("%d", &position);
 InsertElement(L, position, element);
 }
 if (token == 7) {
 printf("请输入要删除元素的位置\n");
 scanf("%d", &position);
 if (position > Length(L)){
 printf("位置不合法\n");
 return 0;
 }
 DeleteElement(L,position);
 }
 if (token == 8) {
 int length = Length(L);
 if (length > 0 ){
 printf("表长为:%d\n",length);
 }
 }
 printMenu();
 printf("请继续选择操作或者输入0结束程序\n");
 scanf("%d", &token);
 }
 return 0;
}
/**
 * 头插法建立单链表
 */
LinkList List_heardInsert(LinkList L) {
 LNode *s;
 int x;
 L = (LinkList) malloc(sizeof(LNode)); //创建第一个结点,并为它分配空间,也就是头节点
 L->next = NULL; //初始化链表为空
 printf("请输入结点的值:\n");
 scanf("%d", &x);
 while (x != 9999) {
 s = (LinkList) malloc(sizeof(LNode));
 s->data = x;//将输入的值赋值给新建结点的数据域中
 s->next = L->next;//将头节点的next指针换到s结点上
 L->next = s;//把s结点接到头指针的next指针下,完成对接
 printf("请继续输入结点的值,或者输入“9999”结束插入元素\n");
 scanf("%d", &x);
 }
 return L;
}
/**
 * 尾插法建立链表
 */
LinkList List_ailInsert(LinkList L) {
 int x;
 L = (LinkList) malloc(sizeof(LNode));
 LNode *s, *r = L;
 printf("请输入结点的值\n");
 scanf("%d", &x);
 while (x != 9999) {
 s = (LinkList) malloc(sizeof(LNode));
 s->data = x;
 r->next = s;
 r = s;
 printf("请输入结点的值,或者输入9999结束插入元素\n");
 scanf("%d", &x);
 }
 r->next = NULL;
 return L;
}
/**
 * 头插法的打印单链表
 */
void printLinkList(LinkList L) {
 if (L == NULL) {
 printf("链表为空\n");
 } else {
 LNode *s;
 s = L->next;
 printf("当前元素为;");
 while (s) {
 printf("%d ", s->data);
 s = s->next;
 }
 printf("\n");
 }
}
/**
 * 按值查找元素
 */
LinkList GetElementByValue(LinkList L, ElementType e) {
 LNode *p = L->next;
 while (p != NULL && p->data != e) {
 p = p->next;
 }
 return p;
}
/**
 * 按序号查找元素
 */
LinkList GetElementByPosition(LinkList L, int position) {
 int j = 1; //计数器
 LNode *p = L->next;
 if (position == 0) {
 return L;
 }
 if (position < 1 || position > Length(L)) {
 printf("位置不合法\n");
 return NULL;
 }
 while (p && j < position) {
 p = p->next;
 j++;
 }
 return p;
}
/**
 * 插入元素
 */
void InsertElement(LinkList L, int position, ElementType e) {
 if (position < 0 || position > Length(L) + 1) {
 printf("插入位置不合法\n");
 return;
 }
 LNode *s, *p;
 s = (LinkList) malloc(sizeof(LNode));
 s->data = e;
 p = GetElementByPosition(L, position - 1);
 s->next = p->next;
 p->next = s;
}
/**
 * 删除结点
 */
void DeleteElement(LinkList L,int position){
 LNode *p,*q;
 p = GetElementByPosition(L,position-1);//找到要删除结点的前驱结点
 q = p->next;//把要删除的那个元素赋值给指针q
 p->next = q->next;//把要删除元素的后一个元素,赋值给要删除元素的前一个元素的后继指针
 free(q);//释放我们要删除的元素的空间
}
/**
 * 求表长
 */
int Length(LinkList L){
 int index = 0;//计数器
 while (L->next != NULL) {
 index++;
 L = L->next;
 }
 return index;
}
/**
 * 打印菜单
 */
void printMenu() {
 printf("菜单\n");
 printf("1.头插法建立单链表 2.尾插法建立单链表\n");
 printf("3.打印链表 4.按位查找元素\n");
 printf("5.按值查找元素 6.插入元素\n");
 printf("7.删除元素 8.求表长\n");
}
#pragma clang diagnostic pop

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值