#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 appendElement (NodePtr paraHeader, char paraChar) //在尾部插入一个新结点
{
NodePtr p,q;
//step 1. 建立一个新的结点(数据为输入的数据)
q = (NodePtr) malloc(sizeof(LNode));
q->data = paraChar;
q->next=NULL;
//step 2. 将指针指向链表尾部
p = paraHeader;
while(p->next!=NULL){
p=p->next;
}
//step 3. 将新结点放在链表的尾部
p->next=q;
}
void insertElement(NodePtr paraHeader, char paraChar, int paraPosition) //将一个数据插入指定位置
{
NodePtr p,q;
//step 1. 将指针指向需要插入的位置同时也是检查位置是否合法
p = paraHeader;
for(int i=0;i<paraPosition;i++)
{
p = p->next;
if(p==NULL){ //插入的位置超过链表的长度
printf("The position %d id beyond the scope of the list",paraPosition);
return;
}
}
//step 2. 建立一个新的结点存放数据
q = (NodePtr)malloc(sizeof(LNode));
q->data = paraChar;
//step 3. 将新结点插入指定位置
printf("linkling\r\n");
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("Cannot delete %c \r\n",paraChar);
return ;
}
//找到该数数据开始删除 (此时p并不是该数据,该数据为p->next)
q=p->next;
p->next=p->next->next;
free(q);
}
void appendInsertDeleteTest()
{
//step 1. 初始化一个空链表并且打印
LinkList tempList = initLinkList();
printList(tempList);
//step 2.加入一些数据 并 打印
appendElement(tempList,'H');
appendElement(tempList,'e');
appendElement(tempList,'l');
appendElement(tempList,'l');
appendElement(tempList,'o');
appendElement(tempList,'!');
printList(tempList);
//step 3. 删除一些元素并打印;
deleteELement(tempList, 'e');
deleteELement(tempList, 'a');
deleteELement(tempList, 'o');
printList(tempList);
//step 4. 插入一个数据在指定位置并打印
insertElement(tempList, 'o', 1);
printList(tempList);
}
void basicAddressTest() //输出地址
{
LNode tempNode1, tempNode2;
tempNode1.data=4;
tempNode1.next=NULL;
tempNode2.data=6;
tempNode2.next=NULL;
printf("The first node: %d, %d, %d \r\n",&tempNode1,&tempNode1.data, &tempNode1.next);
printf("The second node: %d, %d, %d \r\n",&tempNode2,&tempNode2.data, &tempNode2.next);
tempNode1.next=&tempNode2;
}
int main()
{
appendInsertDeleteTest();
}
运行结果
心得体会
通过抄写代码,理解了单链表的增删改查。