带头结点单链表的常用操作
约 959 字大约 3 分钟
2025-06-20
带头结点的单链表的初始化、插入、删除、查询长度和输出元素。
【代码】
#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<malloc.h>
#define MAXSIZE 10 //定义顺序表最大长度
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define LIST_INIT_SIZE 100
#define LISTINCREMENT 10
typedef int Element;
typedef struct node{
Element e;
struct node* next;//这里只是声明了一个名为next的指针,指针本身也占内存空间,里面存放的始终是地址。 struct node* 表示指针的类型是 struct node,即指向的地址里存放的是一个结构体
}LNode, *Linklist;
/**
* 带头结点的单链表进行增删改查
* 头结点就可以指代整个链表了
*/
int main() {
Linklist initLinklist(Linklist head);
int getLength(Linklist head);
Linklist insert(Linklist head, int k, Element e);
Linklist del(Linklist head, int position);
int find(Linklist head, int position);
void output(Linklist head);
Linklist head;//头结点
head = initLinklist(head);
insert(head, 1,1);//只有头结点时,长度是0 ,插入位置从1开始算
insert(head, 2,2);
insert(head, 3,3);
insert (head,2,999);
int listLength = getLength(head);
printf("length is : %d \n",listLength);
output(head);
find(head,2);
del(head, 2);
listLength = getLength(head);
printf("length is : %d \n",listLength);
output(head);
del(head, 1);
printf("length is : %d \n",listLength);
listLength = getLength(head);
output(head);
}
/**
* 初始化单链表,建立一个头结点
*/
Linklist initLinklist(Linklist head){
head = (Linklist)malloc(sizeof(LNode));
head->next = NULL;
printf("init single list successful! \n");
return head;
}
/**
* 插入元素
*/
Linklist insert(Linklist head, int k, Element e){
int getLength(Linklist head);
Linklist p = (Linklist)malloc(sizeof(LNode));//申请一个新节点
Linklist pre = (Linklist)malloc(sizeof(LNode));//申请一个新节点
int length = getLength(head);
pre = head;
if(k == length+1){ //在链表末尾添加新节点
while(pre->next) {
pre = pre->next;
}//循环结束时,pre已经到达链表末尾
p->e = e;
pre->next = p;
p->next = NULL;
}else if(k > 0 && k <= length){//在链表中间添加节点 ,插入位置从1开始算
int j = 1;
while(j < k) {
pre = pre->next;
j++;
}//循环结束时,pre是要插入位置的前驱节点
p->e = e;
p->next = pre->next;
pre->next = p;
}else{
printf("插入的位置有误!\n");
}
return head;
}
/**
* 删除指定位置的链表元素
*/
Linklist del(Linklist head, int position) {
int getLength(Linklist head) ;
int length = getLength(head);
if(position <= 0 || position > length ){
printf("删除位置有误!\n");
}else{
Linklist pre = (Linklist)malloc(sizeof(LNode));
Linklist key = (Linklist)malloc(sizeof(LNode));//key是被删除的元素
pre = head;
int k = 1;
while(k < position){
pre = pre->next;
k++;
}//循环结束时,pre是被删除节点的前驱元素
key = pre->next;
key->e = pre->next->e;
if(position == length) {//被删除的是链表末尾元素
pre->next = NULL;
}else{//被删除的是链表中间元素
pre->next = key->next;
}
printf("删除的位置是%d, 删除位置的元素是%d \n", position, key->e) ;
free(key);
}
return head;
}
/**
* 查询指定位置的链表元素
*/
int find(Linklist head, int position){
int getLength(Linklist head);
Linklist pre = (Linklist)malloc(sizeof(LNode));
pre = head;
int length = getLength(head);
int k = 1;
if(position <= length){
while(k < position) {
pre = pre->next;
k++;
}//循环结束时,pre是被查询节点的前驱元素
int key = pre->next->e;
printf("------------------------------\n");
printf("位置%d的元素内容是%d\n", position,key);
printf("------------------------------\n");
}else{
printf("查询位置有误!\n");
}
}
/**
* 输出链表元素
*/
void output(Linklist head){
Linklist p = (Linklist)malloc(sizeof(LNode));//申请一个新节点
p = head;
do{
p = p->next;
printf("%5d", p->e);
}while(p->next);
printf("\n");
}
/**
* 求单链表的长度
* 长度不算头结点
*/
int getLength(Linklist head){
int length = 0;
Linklist p = (Linklist)malloc(sizeof(LNode));//申请一个新节点
p = head;
while(p->next){
length++;
p = p->next;
}
return length;
}
【运行结果】
init single list successful!
length is : 4
1 999 2 3
------------------------------
位置2的元素内容是999
------------------------------
删除的位置是2, 删除位置的元素是999
length is : 3
1 2 3
删除的位置是1, 删除位置的元素是1
length is : 3
2 3
--------------------------------
Process exited after 0.06326 seconds with return value 0
请按任意键继续. . .