#include <stdio.h>
#include <stdlib.h>
typedef struct node{//定义结构体Node
int data;
struct node *next;
}Node;
//函数1:创建整数单链表,输入8个数据,并存储在单链表中
Node *create_list(){
Node *head, *tail, *pnew;//头结点、尾节点、新节点
head = tail = NULL;//初始时头结点和尾节点为NULL
int i, num;
for(i=0; i<8; i++){//循环8次,输入8个数据
printf("请输入第%d个数:", i+1);
scanf("%d", &num);
pnew = (Node*)malloc(sizeof(Node));//新建一个节点
if(pnew == NULL){//如果内存分配失败
printf("内存分配失败!");
exit(1);//结束程序
}
pnew->data = num;
pnew->next = NULL;
if(head == NULL){
head = tail = pnew;//如果链表为空,则头节点为pnew,尾节点也为pnew
}
else{
tail->next = pnew;//如果链表不为空,则在尾节点后添加pnew节点
tail = pnew;//更新尾节点
}
}
return head;//返回头结点
}
//函数2:遍历并输出单链表中所有数据元素
void print_list(Node *list){
if(list == NULL)
return;
printf("%d ", list->data);
print_list(list->next);//递归输出下一个节点
}
//函数3:按序号查找,返回数据元素的值或地址
Node *search_by_index(Node *list, int index){
Node *p;
p = list;//从头结点开始查找
int i = 1;
while(p != NULL && i < index){//循环查找直到找到指定节点或查找完整个链表
p = p->next;
i++;
}
if(p != NULL)
{
printf("按序号查找到的节点的值:%d\n", p->data);
printf("按序号查找到的节点的地址:%p\n", p);
}else{
printf("未按序号查找到指定节点\n");
}
return p;//返回查找到的节点指针
}
//函数4:按值查找,返回数据元素的序号或地址
int search_by_value(Node *list, int value){
Node *p;
int index = 0;
for(p = list; p != NULL; p = p->next){
index++;
if(p->data == value){//查找到相同的数据元素,返回其序号
printf("按值查找到的节点的序号:%d\n", index);
printf("按值查找到的节点的地址:%p\n", p);
return index;
}
}
printf("未按值查找到指定节点\n");
return 0;//未查找到,返回0
}
//函数5:指定位置(序号)插入新的数据元素
void insert_by_index(Node *list, int index, int value){
Node *pnew, *p;
pnew = (Node*)malloc(sizeof(Node));//新建一个节点
if(pnew == NULL){
printf("内存分配失败!");
exit(1);
}
p = search_by_index(list, index);//先查找索引为index的节点
if(p == NULL){
printf("位置错误!");
exit(1);
}
pnew->data = value;
pnew->next = p->next;//新节点的next指针指向p的下一个节点
p->next = pnew;//p的next指针指向新节点
}
//函数6:删除指定位置(序号)数据元素。
void delete_by_index(Node *list, int index){
Node *p, *pre;
p = search_by_index(list, index);//先查找索引为index的节点
if(p == NULL){
printf("位置错误!");
exit(1);
}
pre = search_by_index(list, index-1);//再查找索引为index-1的节点,即p的前一个节点
if(pre == NULL){//如果p是头结点,则pre也为NULL
list = p->next;//头结点指向p的下一个节点,删除头结点
}
else{
pre->next = p->next;//前一个节点的next指针指向p的下一个节点,删除p节点
}
free(p);//释放被删除节点p的空间
}
int main(){
Node *list;
int value, index;
list = create_list();//创建单链表
printf("原始链表:");
print_list(list);//遍历并输出单链表中所有数据元素
printf("\n");
printf("请输入要查找的序号:");
scanf("%d", &value);
search_by_index(list, value);//按值查找并输出结果
printf("请输入要查找的值:");
scanf("%d", &value);
search_by_value(list, value);//按值查找并输出结果
printf("请输入要插入的值和插入位置:");
scanf("%d %d", &value, &index);
insert_by_index(list, index, value);//插入新的数据元素
printf("插入后的链表:");
print_list(list);
printf("\n");
printf("请输入要删除节点的位置:");
scanf("%d", &index);
delete_by_index(list, index);//删除指定位置(序号)数据元素
printf("删除后的链表:");
print_list(list);
printf("\n");
return 0;
}
本文来自QSZ学习网站,作者:北边村的富少,转载请注明原文链接:https://www.cnblogs.com/qsz666/p/18061533