在上一篇博客的基础上,我们继续深入学习线性数据结构,今天主要用c语言实现了单链表的增-删-改-查,创建链表时分别使用了头插法和尾插法,查询分为按值查询与链表序号查询。
编译:vc6
#include<stdio.h>
#include<stdlib.h>
//定义链表结构体
typedef struct student{
int score;
struct student *next;
} LinkList;
//定义一个创建节点的函数 尾插法
LinkList *Toilcreat(int n){
int i;
LinkList *head, *node, *end;//定义头节点,普通节点,尾部节点;
head = (LinkList*)malloc(sizeof(LinkList));//分配地址
end = head; //若是空链表则头尾节点一样
for (i = 0; i < n; i++) {
node = (LinkList*)malloc(sizeof(LinkList));
scanf("%d", &node->score);
end->next = node;
end = node;
}
end->next = NULL;//结束创建
return head;
};
//定义一个创建节点的函数 头插法
LinkList *Headcreat(int n){
int i;
LinkList *L,*s; //定义指针L和辅助指针s
L = (LinkList*)malloc(sizeof(LinkList));//分配地址
L->next = NULL;
for (i = 0; i < n; i++) {
s = (LinkList*)malloc(sizeof(LinkList));
scanf("%d", &s->score);
s->next=L->next;
L->next = s;
}
return L;
};
//定义一个修改指点节点元素的函数
void change(LinkList *list,int n) {
//n为第n个节点
LinkList *t = list;
int i = 0;
while (i < n && t != NULL) {
t = t->next;
i++;
}
if (t != NULL) {
puts("输入要修改的值");
scanf("%d", &t->score);
}
else {
puts("节点不存在");
}
}
//定义一个指定节点插入值的函数
void insert(LinkList *list, int n) {
LinkList *t = list, *in;
int i = 0;
while (i < n && t != NULL) {
t = t->next;
i++;
}
if (t != NULL) {
in = (LinkList*)malloc(sizeof(LinkList));
puts("输入要插入的值");
scanf("%d", &in->score);
in->next = t->next;//填充in节点的指针域,也就是说把in的指针域指向t的下一个节点
t->next = in;//填充t节点的指针域,把t的指针域重新指向in
}
else {
puts("节点不存在");
}
}
//定义一个打印链表的函数
void ShowList(LinkList *h){
while (h->next != NULL) {
h = h->next;
printf("%d ", h->score);
}
printf("\n");
}
//定义一个查询指定位置元素的方法
void GetElement(LinkList *h,int n){
int j=1;
LinkList *p = h->next; //第一个节点赋值给p
if (n<=0)
printf("Null");
while(p&&j<n){
p = p->next;
j++;
}
printf("%d\n",p->score);
}
//定义一个按照值查询元素位置的方法
void GetId(LinkList *h,int x){
int j=1,m=0; //计数
LinkList *p = h->next; //第一个节点赋值给p
while (p->next!= NULL){
p = p->next;
j++;
if(p->score==x){
printf("%d ",j);
m++;
}
}
if (m==0)
printf("查询元素不存在!\n");
}
//定义一个删除链表节点的方法
void DeleteElment(LinkList *h,int n){
LinkList *p=h,*q;
int i=1;
//1.取指向删除位置的前驱结点的指针
while (i!=n){
p = p->next;
i++;
}
//2.取指向删除位置的指针
q = p->next;
//3.删除位置的前驱结点的指针后继指向删除位置指针前驱后继
p->next = q->next;
//4.释放删除节点
free(q);
}
void main(){
LinkList *h,*w;
h = Headcreat(5);
printf("头插法创建链表为:");
ShowList(h);
w = Toilcreat(5);
printf("尾插法创建链表为:");
ShowList(w);
printf("删除链表第二个节点后:");
DeleteElment(w,2);
ShowList(w);
printf("查询链表第二位元素为:");
GetElement(w,2);
printf("查询链表中值为2的元素位置为:");
GetId(w,6);
change(w,2);
printf("修改链表中第二个节点后:");
ShowList(w);
insert(w,2);
printf("链表中第二个节点插入后:");
ShowList(w);
}