单链表操作大致包括
//初始化链表
void ListInitinate(SLNode** head);
//初始化头指针为head的链表
//求当前链表长度
int ListLength(SLNode* head);
//求头指针为head的链表的长度
//插入数据元素
int ListInsert(SLNode* head, int i, DataType x);
//在头指针为head的链表中,在第i个结点前插入结点x
//删除数据元素
int ListDelete(SLNode* head, int i, DataType* x);
//在头指针为head的链表中,删除第i个头结点,并将删除的头结点有x带回
//取数据元素
int ListGet(SLNode* head, int i, DataType* x);
//在头指针为head的链表中取出第i个数据元素,由x带回
//撤销单链表
void Destory(SLNode** head);
//释放动态申请的内存空间
1.定义数据元素
/*定义数据元素*/
typedef int DataType;
typedef struct Node
{
DataType data; //存放数据元素
struct Node* next; //存放用来指向下个节点的指针
}SLNode;
2.初始化链表
//初始化链表
//初始化头指针为head的链表
void ListInitinate(SLNode** head)
{
*head = (SLNode*)malloc(sizeof(SLNode));//申请头结点,由head指示其地址
(*head)->next = NULL; //置结束标记NULL
}
3.插入数据元素
//插入数据元素
//在头指针为head的链表中,在第i个结点前插入结点x
//插入成功返回1,失败返回0
int ListInsert(SLNode* head, int i, DataType x)
{
SLNode* p, * q;
int j;
p = head;//定位到链表入口
j = -1; //头指针位置
while(p->next != NULL && j < i - 1)//定位,找下标
{
p = p->next;
j++;
}
if (j != i - 1)
{
printf("插入元素出错!");
return 0;
}
q = (SLNode*)malloc(sizeof(SLNode)); //生成新结点
q->data = x; //新节点数据域赋值
q->next = p->next;
p->next = q;
return 1;
}
4.求当前链表长度
//求当前链表长度
//求头指针为head的链表的长度
int ListLength(SLNode* head)
{
SLNode* p = head; //p指向头结点
int size = 0; //size初始为0
while (p->next != NULL)//循环计数
{
p = p->next;
size++; //计算单链表长度
}
return size;
}
5.删除数据元素
//删除数据元素
//在头指针为head的链表中,删除第i个头结点,并将删除的头结点有x带回
//删除成功返回1,否则返回0
int ListDelete(SLNode* head, int i, DataType* x)
{
SLNode* p, * s;
int j;
p = head;
j = -1;
/*找位置*/
while (p->next != NULL && p->next->next != NULL && j < i -1)//循环结束时指针p指向第i-1个结点
{
p = p->next;//将next中的值传给p
j++;
}
if (j != i - 1)
{
printf("删除元素位置错误!");
return 0;
}
s = p->next;//把s指针指向ai结点
*x = s->data;//把s指针所指向的结点的数据域值赋予x 将删除的值保存在x中
p->next = p->next->next;//删除
free(s);//释放指针s所指向的结点的内存空间
return 1;
}
6.取数据元素
//取数据元素
//在头指针为head的链表中取出第i个数据元素,由x带回
//成功取出返回1,否则返回0
int ListGet(SLNode* head, int i, DataType* x)
{
SLNode* p;
int j;
p = head;
j = -1;
while (p->next != NULL && j < i)
{
p = p->next;
j++;
}
if (j != i)
{
printf("取元素位置错误");
return 0;
}
*x = p->data;
return 1;
}
7.撤销单链表
//撤销单链表
//释放动态申请的内存空间
void Destory(SLNode** head)
{
SLNode* p, * p1;
p = *head;
while (p != NULL)
{
p1 = p;
p = p->next;
free(p1);
}
*head = NULL;
}
例题:
建立数值分别为 1,2,3,„,10 的单链表,然后删除数值 4, 最后输出该单链表。
#include<stdio.h>
#include<malloc.h>
#include"linlist.h" //包含单链表的头文件
int main()
{
SLNode* head;
int i, x;
ListInitinate(&head);
for (i = 0; i < 10; i++)
{
ListInsert(head, i, i + 1);
}
ListDelete(head, 3, &x);
for (i = 0; i < ListLength(head); i++)
{
ListGet(head, i, &x);
printf("%d\n", x);
}
Destory(&head);
}
程序结果运行如下