单链表的介绍
线性表的链式存储结构,简称链表,有单链表和双链表两类。单链表是一种基本的数据结构,有两部分组成:指针域和数据域,数据域用于存放数据,指针域用于指向下一个结点的位置。
为了操作方便,一般为单链表创建一个头结点,指向线性表的的首元素。线性表的最后一个元素的指针域为空,表示链表的结束。
同顺序表一样,链表也有许多基本操作,如:
(1) 单链表的创建
(2) 单链表元素的插入
(3) 单链表元素的删除
(4) 单链表元素的查找(定位)
单链表的基本操作
单链表的定义
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef int Status;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
单链表的初始化
void InitList(LinkList L){
L->next=NULL;
L->data=0;
printf("带有头结点的单链表初始化完毕\n\n");
}
单链表的遍历
void PrintList(LinkList L){
LNode *p;
p=L->next;
if(p==NULL){
printf("单链表为空\n\n");
return;
}
printf("单链表的结点值为:");
while(p){
printf("%d ",p->data);
p=p->next;
}
printf("\n\n");
}
结点的头插法
Status InsertHead(LinkList L){
//创建结点
LNode *p;
ElemType d;
printf("请输入结点的值:");
scanf("%d",&d);
p=(LNode *)malloc(sizeof(LNode));
p->data=d;
p->next=L->next;
L->next=p;
printf("头插法插入结点成功\n\n");
return OK;
}
结点的尾插法
Status InsertTail(LinkList L){
LNode *p,*q;
ElemType d;
printf("请输入结点的值:");
scanf("%d",&d);
p=L;
q=(LNode *)malloc(sizeof(LNode));
q->next=NULL;
q->data=d;
while(p->next){
p=p->next;
}
p->next=q;
printf("尾插法创建单链表成功\n\n");
return OK;
}
获取某个位置的元素
Status GetElem(LinkList L,int loc){
int i=0;
LNode *p;
p=L->next;
while(p){
i++;
if(i==loc){
printf("单链表的第%d个元素是:%d\n\n",loc,p->data);
break;
}
p=p->next;
}
if(!p){
printf("该位置超过单链表的长度\n\n");
return ERROR;
}
return OK;
}
单链表结点的删除
Status DeleteNode(LinkList L,int loc){
int i;
LNode *p,*q;
p=L;
if(!p->next){
printf("单链表为空\n\n");
return ERROR;
}
if(loc<=0){
printf("位置必须大于0\n\n");
return ERROR;
}
for(i=0;i<loc-1;i++){
p=p->next;
if(!p){//说明单链表结束
printf("第%d个元素不存在\n",loc);
return ERROR;
}
}
q=p->next;
p->next=q->next;
free(q);
printf("结点删除成功\n");
return OK;
}
主函数中的相关操作
int main(void){
LinkList L;
L=(LNode *)malloc(sizeof(LNode));
InitList(L);
InsertHead(L);
InsertHead(L);
PrintList(L);
InsertTail(L);
InsertTail(L);
PrintList(L);
GetElem(L,4);
DeleteNode(L,1);
PrintList(L);
DeleteNode(L,0);
PrintList(L);
return 0;
}