单链表
一、单链表的定义
链表概念:
链表中的数据是以结点来表示的,每个结点的构成:元素(数据元素的映象) + 指针(指示后继元素存储位置),元素就是存储数据的存储单元,指针就是连接每个结点的地址数据。
二、链表的创建:
typedef struct LinkNode{
char data;
struct LinkNode *next;
} LNode, *LinkList, *NodePtr;
三、链表的初始化
LinList initLinkList(){
NodePtr tempHeader = (NodePtr)malloc(sizeof(LNode));
tempHeader->data = "\0";
tempHeader->next = NULL ;
return temHeader ;
}
四、尾插法:
代码演示:
void appendElement(NodePtr paraheader,char parachar){
NodePtr p,q;
p=(NodePtr)malloc(sizeof(LNode));
p->data=parachar;
p->next=NULL;
q=paraheader;
while(q->next!=NULL){
q=q->next;
}
q->next=p;
}
五、头插法:
代码演示:
void appendElement2(NodePtr paraheader,char parachar){
NodePtr p,q;
p=(NodePtr)malloc(sizeof(LNode));
p->data=parachar;
q=paraheader;
p->next=q->next;
q->next=p; //头插法
}
六、任意插入:
代码演示
void insertElement(NodePtr paraHeader, char paraChar, int paraPosition){
NodePtr p,q;
p=paraHeader;
for(int i=0;i<paraPosition;i++){
p = p->next;
}
if(p=NULL){
printf("The position %d is beyond the scope of the list.", paraPosition);
}
q=(NodePtr)malloc(sizeof(LNode));
q->data=parachar;
q->next=p->next;
p->next=q;
}
七、删除
代码演示
void deleteElement(NodePtr paraHeader, char paraChar){
NodePtr p,q;
p=paraHeader;
while(p->next!=NULL && p->next!=paraChar){
p=p-next;
}
if(p->next==NULL){
printf("can't delete %c",paraChar);
}
q=p->next;
p->next=p->next->next;
free(q);
}
注意:
1、不需要申请动态内存空间,是因为没有添加新的元素
2、要先用一个指针指向p->next,不能直接释放q的内存,否则如果先释放了q的内存,就不能在指向q的下一个,即为原来的p->next->next,要先让p->next等于p->next->next,再释放q的内存
八、销毁链表:
代码演示:
void destroyList(NodePtr paraHeader){
NodePtr p=paraHeader;
while(p!=NULL){
p = p->next;
free(p);
}
printf("销毁成功"); //销毁链表
}
注意:从头指针开始依次释放所有结点
九、清空链表:
代码演示:
void clearList(NodePtr paraHeader){
NodePtr p,q;
q=paraHeader->next;
while(q!=NULL){
p=q->next;
free(q);
q=p;
}
printf("清除成功")
}
注意:链表仍然在,但表中无元素,为空表,依次释放所有结点
十、获取链表长度:
代码演示:
void Listlength(NodePtr paraHeader){
NodePtr p;
p=paraHeader;
for(int i=0;p!=NULL;i++){
p=p->next;
}
printf("链表长度为%d",i-1);
}
十一、查找第x位元素:
代码演示:
void getElement(NodePtr paraHeader,char paraChar,int paraPosition){
NodePtr p;
p=paraHeader;
for(int i=0;i<paraPosition;i++){
p=p->next;
}
printf("第%d位的元素为%c",paraPosition,p);
}
十二、查找元素x的位置:
代码演示:
void locateElement(NodePtr paraHeader,char paraChar){
NodePtr p;
p=paraHeader;
int i;
for(i=0;p->data!=paraChar;i++){
p=p->next;
}
printf("元素%c在第%d位",paraChar,i);
}
十三、总代码演示:
代码演示:
#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;
}
}
void appendElement(NodePtr paraheader,char parachar){
NodePtr p,q;
p=(NodePtr)malloc(sizeof(LNode));
p->data=parachar;
p->next=NULL;
q=paraheader;
while(q->next!=NULL){
q=q->next;
}
q->next=p;
} //尾插法
void appendElement2(NodePtr paraheader,char parachar){
NodePtr p,q;
p=(NodePtr)malloc(sizeof(LNode));
p->data=parachar;
p->next=NULL;
q=paraheader;
p->next=q->next;
q->next=p; //头插法
}
void insertElement(NodePtr paraHeader,char paraChar,int paraPosition){
NodePtr p,q;
p=paraHeader;
for(int i=0;i<paraPosition;i++){
p = p->next;
}
if(p==NULL){
printf("The position %d is beyond the scope of the list.", paraPosition);
return;
}
q=(NodePtr)malloc(sizeof(LNode));
q->data=paraChar;
q->next=p->next;
p->next=q; //任意插入
}
void deleteElement(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("can't delete %c",paraChar);
}
q=p->next;
p->next=p->next->next;
free(q); //删除
}
void destroyList(NodePtr paraHeader){
NodePtr p=paraHeader;
while(p!=NULL){
free(p);
p=p->next;
}
printf("销毁成功"); //销毁链表
}
void clearList(NodePtr paraHeader){
NodePtr p,q;
q=paraHeader->next;
while(q!=NULL){
p=q->next;
free(q);
q=p;
}
printf("清除成功");
}
void Listlength(NodePtr paraHeader){
NodePtr p;
p=paraHeader;
int i=0;
for(i=0;p!=NULL;i++){
p=p->next;
}
printf("链表长度为%d",i-1);
}
void getElement(NodePtr paraHeader,int paraPosition){
NodePtr p;
p=paraHeader;
for(int i=0;i<paraPosition;i++){
p=p->next;
}
printf("第%d位的元素为%c",paraPosition,p->data);
}
void locateElement(NodePtr paraHeader,char paraChar){
NodePtr p;
p=paraHeader;
int i;
for(i=0;p->data!=paraChar;i++){
p=p->next;
}
printf("元素%c在第%d位",paraChar,i);
}
void appendInserttest(){
NodePtr List=initLinkList();
appendElement(List,'H');
appendElement(List,'E');
appendElement(List,'L');
appendElement(List,'L');
appendElement(List,'O');
appendElement(List,'!');
printf("链表为:");
printList(List);
insertElement(List,'!',2);
printf("\n") ;
printf("在第二位添加!");
printf("\n") ;
printList(List);
printf("\n") ;
deleteElement(List,'E');
printf("删除E后");
printf("\n") ;
printList(List);
printf("\n") ;
getElement(List,2);
printf("\n") ;
locateElement(List,'H');
printf("\n") ;
printf("正在清除链表...");
printf("\n") ;
clearList(List);
printf("\n") ;
printf("正在销毁链表...");
printf("\n") ;
destroyList(List);
printf("\n") ;
}
void appendtest2(){
NodePtr List=initLinkList();
appendElement2(List,'1');
appendElement2(List,'2');
appendElement2(List,'3');
appendElement2(List,'4');
appendElement2(List,'5');
appendElement2(List,'6');
printf("\n") ;
printf("头插法");
printf("\n") ;
printList(List);
Listlength(List);
}
int main(){
appendInserttest();
appendtest2();
return 0;
}