效果图
编译工具:
代码:
#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