单链表的基本使用
单链表的相关函数放在LinkList.h头文件中
/*
*单链表的实现与操作
优点:不需要预先确定数据元素的个数
缺点:空间单元利用率不高
*/
/*==================单链表结构体=============================*/
typedef struct Node{
DataType data; //数据域
struct Node *next; //指向下一个结点的指针
}SlNode;
/*=================初始化单链表================================*/
void ListInitiate(SlNode **head){ //这里需要设计成指针的指针类型,不然得不到head的具体值
*head = (SlNode*)malloc(sizeof(SlNode)); //申请一个带头结点的空间,head指向其首地址
(*head)->next = NULL;
}
/*============计算单链表长度=====================================*/
int ListLength(SlNode *head){
SlNode *p = head; //p指向头指针
int size = 0;
while( p->next!=NULL ){ //循环计数
p = p->next;
size++; //经过的结点个数,即长度
}
return size;
}
/*================单链表的插入操作==================================*/
int ListInsert(SlNode *head, int i, DataType x){
SlNode *p,*q;
int j = -1;
p = head;
while( p->next!=NULL && j<i-1 ){ //让p指针指向第i-1个结点
p = p->next;
j++;
}
if( j!=i-1 ){
printf("插入位置i参数错误!\n");
return 0;
}
q=(SlNode*)malloc(sizeof(SlNode)); //生成新节点
q->data = x; //q的数据域为x
/*插入操作*/
q->next = p->next;
p->next = q;
return 1;
}
/*====================删除链表的第i个元素,并用x接收=====================*/
int ListDelete(SlNode *head, int i, DataType *x){
SlNode *p, *s;
int j;
p = head; //p指针指向第一个结点位置
while(p->next!=NULL && p->next->next!=NULL&& j<i-1){ //不断的向下寻找,找到i-1个结点
p = p->next; //p指针向下一个结点移动
j++; //记录移动到第几个位置
}
if(j!=i-1){ //没有找到这个位置
printf("删除位置i错误!\n");
return 0;
}
s = p->next;
*x = s->data;
p->next = p->next->next; //删除
free(s);
return 1;
}
/*================获取链表中第i个位置的元素,用x接收===========================*/
int ListGet(SlNode *head, int i, DataType *x){
SlNode *p;
int j;
p = head; //从头结点开始
j = -1;
while( p->next !=NULL &&j<i){ //依次向下寻找,直到找到第i个位置
p = p->next; //向下依次移动
j++; //记录移动到哪一个位置
}
if( j!=i){ //没有找到这个位置
printf("位置参数i错误!\n");
}
*x = p->data; //获取到第i个位置的数据域内容
return 1;
}
/*===============================销毁单链表=================================*/
void Destroy(SlNode **head){
SlNode *p, *p1;
p = *head; //从首位置开始
while( p!=NULL ){
p1 = p;
p = p->next; //向下依次移动,并回收空间
free(p1);
}
*head = NULL; //最后置头指针为NULL
}
测试代码
#include <stdio.h>
#include <malloc.h>
typedef int DataType; //定义DataType为int类型
#include "LinkList.h"
int main(void){
SlNode *head;
int i, x;
ListInitiate(&head); //初始化链表
printf("\n\n***************************************线性表初始化数据**********************************************\n");
for(i=0; i<10; i++){
ListInsert(head, i, i+3);
}
for(i=0; i<ListLength(head); i++){
ListGet(head,i,&x);
printf("第%d个位置:%d ",i+1,x);
}
printf("\n\n************************************删除第4个位置的元素*************************************************\n");
ListDelete(head,4,&x);
for(i=0; i<ListLength(head); i++){
ListGet(head,i,&x);
printf("第%d个位置:%d ",i+1,x);
}
Destroy(&head);
printf("\n");
system("pause");
return 0;
}
测试运行图