关于单链表
单链表是链式存储结构,其每一个元素的位置是任意的,即逻辑上相邻的数据元素在物理上不一定相邻。
单链表的操作
1.创建链表
typedef struct LinkNode
{
char data;
struct LinkNode*next;
} LNode, *LinkList, *NodePtr;
2.初始化
LinkList initLinkList()
{
NodePtr tempHeader=(NodePtr)malloc(sizeof(LNode));
tempHeader->data='\0';
tempHeader->next=NULL;
return tempHeader;//头结点
}
3.打印
void printList(NodePtr paraHeader)
{
NodePtr p=paraHeader->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\r\n");
}
4. 赋值
void addElement(NodePtr paraHeader,char parachar)
{
NodePtr p,q;
//建立新结点
q=(NodePtr)malloc(sizeof(LNode));
q->data=parachar;
q->next=NULL;
//找尾部
p=paraHeader;
while(p->next!=NULL)
{
p=p->next;
}
//连接结点
p->next=q;
}
5.插入
void insertElement(NodePtr paraHead,char parachar,int paraPosition)
{
NodePtr p,q;
//判断位置合法性
p=paraHead;
for(int i=0;i<paraPosition;i++)
{
p=p->next;
if(p==NULL)
{
printf("该位置超出链表长度\r\n");
return;
}
}
//建立新结点
q=(NodePtr)malloc(sizeof(LNode));
q->data=parachar;
//连接结点
printf("Linking\r\n");
q->next=p->next;
p->next=q;
}
6.按元素删除
void deleteElement1(NodePtr paraHeader,char parachar)
{
NodePtr p,q;
//寻找删除元素
p=paraHeader;
while((p->next!=NULL)&&(p->next->data!=parachar))
{
p=p->next;
}
if(p->next==NULL)//该元素不存在
{
printf("无法删除%c\r\n",¶char);
return;
}
//删除操作
q=p->next;
p->next=p->next->next;
free(q);//删除q
}
7.按位置删除
void deleteElement2(NodePtr paraHeader,int paraPosition)
{
NodePtr p,q;
//判断位置合法性
p=paraHeader;
for(int i=0;i<paraPosition-1;i++)
{
p=p->next;
if(p==NULL)
{
printf("该位置超出链表长度\r\n");
return;
}
}
q=p->next;
p->next=p->next->next;
free(q);//删除q
}
单链表功能测试
void addDeleteInsertElementText()
{
LinkList tempList=initLinkList();//初始化链表
//赋值测试
addElement(tempList,'B');
addElement(tempList,'i');
addElement(tempList,'r');
addElement(tempList,'t');
addElement(tempList,'h');
addElement(tempList,'d');
addElement(tempList,'a');
addElement(tempList,'y');
addElement(tempList,'!');
printList(tempList);
//删除测试1
deleteElement1(tempList,'i');
deleteElement1(tempList,'h');
deleteElement1(tempList,'y');
printList(tempList);
//插入测试
insertElement(tempList,'a',10);
insertElement(tempList,'x',3);
printList(tempList);
//删除测试2
deleteElement2(tempList,9);
printList(tempList);
deleteElement2(tempList,1);
printList(tempList);
deleteElement2(tempList,2);
printList(tempList);
}
赋值测试结果
Birthday!
删除测试1结果
Brtda!
插入测试结果
该位置超出链表长度
Linking
Brtxda!
删除测试2结果
该位置超出链表长度
Brtxda!
rtxda!
rxda!
总代码
#include <stdio.h>
#include <malloc.h>
//创建链表
typedef struct LinkNode
{
char data;
struct LinkNode*next;
} LNode, *LinkList, *NodePtr;
//初始化
LinkList initLinkList()
{
NodePtr tempHeader=(NodePtr)malloc(sizeof(LNode));
tempHeader->data='\0';
tempHeader->next=NULL;
return tempHeader;//头结点
}
//打印
void printList(NodePtr paraHeader)
{
NodePtr p=paraHeader->next;
while(p!=NULL)
{
printf("%c",p->data);
p=p->next;
}
printf("\r\n");
}
//赋值
void addElement(NodePtr paraHeader,char parachar)
{
NodePtr p,q;
//建立新结点
q=(NodePtr)malloc(sizeof(LNode));
q->data=parachar;
q->next=NULL;
//找尾部
p=paraHeader;
while(p->next!=NULL)
{
p=p->next;
}
//连接结点
p->next=q;
}
//插入
void insertElement(NodePtr paraHead,char parachar,int paraPosition)
{
NodePtr p,q;
//判断位置合法性
p=paraHead;
for(int i=0;i<paraPosition;i++)
{
p=p->next;
if(p==NULL)
{
printf("该位置超出链表长度\r\n");
return;
}
}
//建立新结点
q=(NodePtr)malloc(sizeof(LNode));
q->data=parachar;
//连接结点
printf("Linking\r\n");
q->next=p->next;
p->next=q;
}
//删除指定元素
void deleteElement1(NodePtr paraHeader,char parachar)
{
NodePtr p,q;
//寻找删除元素
p=paraHeader;
while((p->next!=NULL)&&(p->next->data!=parachar))
{
p=p->next;
}
if(p->next==NULL)//该元素不存在
{
printf("无法删除%c\r\n",¶char);
return;
}
//删除操作
q=p->next;
p->next=p->next->next;
free(q);//删除q
}
//删除指定位置的元素
void deleteElement2(NodePtr paraHeader,int paraPosition)
{
NodePtr p,q;
//判断位置合法性
p=paraHeader;
for(int i=0;i<paraPosition-1;i++)
{
p=p->next;
if(p==NULL)
{
printf("该位置超出链表长度\r\n");
return;
}
}
q=p->next;
p->next=p->next->next;
free(q);//删除q
}
//测试
void addDeleteInsertElementText()
{
LinkList tempList=initLinkList();//初始化链表
//赋值测试
addElement(tempList,'B');
addElement(tempList,'i');
addElement(tempList,'r');
addElement(tempList,'t');
addElement(tempList,'h');
addElement(tempList,'d');
addElement(tempList,'a');
addElement(tempList,'y');
addElement(tempList,'!');
printList(tempList);
//删除测试1
deleteElement1(tempList,'i');
deleteElement1(tempList,'h');
deleteElement1(tempList,'y');
printList(tempList);
//插入测试
insertElement(tempList,'a',10);
insertElement(tempList,'x',3);
printList(tempList);
//删除测试2
deleteElement2(tempList,9);
printList(tempList);
deleteElement2(tempList,1);
printList(tempList);
deleteElement2(tempList,2);
printList(tempList);
}
int main()
{
addDeleteInsertElementText();
}