此博客将详细介绍单链表的创建、删除、排序、插入、查找、求长
用一个简单的单链表作为例子,此链表只存放一个int,链表头结点不存放数据
主函数
#include <stdio.h>
#include <stdlib.h>
typedef struct node
{
int num; //数据域
struct node *next; //指针域
}Node;
int main(int argc, char const *argv[])
{
Node *Head;
Head=Set(); //创建链表
/* ··· */ //这里是所需的的其他操作
return 0;
}
创建
输入0时结束
Node *Set(void){
Node *Head=(Node *)malloc(sizeof(Node));
Head->next=NULL;
Node *pre=NULL,*t=pre,*p;
while(1){
p=(Node *)malloc(sizeof(Node));
p->next=NULL;
scanf("%d",&p->num);
if(p->num==0){
free(p);
break;
}
if(pre==NULL)
pre=p;
else{
t->next=p;
}
t=p;
}
Head->next=pre;
return Head;
}
删除
删除某个值为nu所有结点
void Del(Node *Head,int nu){
Node *t=Head;
Node *p=Head->next;
while(p){
if(p->num==nu){
t->next=p->next;
free(p);
p=t->next; //继续向后删 删除所有num=nu的结点
}
else{
t=p;
p=p->next; //若不相等,继续向后找
}
}
}
求长
int Len(Node *Head){
int count=0;
Node *t=Head->next;
while(t){
t=t->next;
count++;
}
return count;
}
打印
根据所需打印链表的信息
void Show(Node *Head){
Node *t=Head->next;
while(t){
printf("%d ",t->num);
t=t->next;
}
printf("\n");
}
排序
关于排序,本人写过一篇较为详细的冒泡排序博客
单链表的冒泡排序
插入
增添结点,新节点num值为n
尾插
void Add(Node *Head,int n){
Node *t=Head->next;
Node *p=(Node *)malloc(sizeof(Node));
p->num=n;
p->next=NULL;
while(t->next){
t=t->next;
}
t->next=p;
}
头插
void Add2(Node *Head,int n){
Node *p=(Node *)malloc(sizeof(Node));
p->num=n;
p->next=Head->next;
Head->next=p;
}
查找
在链表中查找num值为n的结点,找到返回此节点,没找到返回NULL
Node *Find(Node *Head,int n){
Node *t=Head->next;
while(t){
if(t->num==n)
break;
t=t->next;
}
return t;
}