上节课老师对单链表进行了进一步的讲解,并教会了我们通过图示法来分析理解,例如初始化阶段,假定tempHeader地址为7800,tempHeader->next为空,后续指向下一个节点来连接。其中老师讲了两种方法来解决。个人感觉插入和添加还是可以的,就是删除比较难一点,有点绕,不过通过图示法可以更容易理解一点。在插入数据时,一定要先将前驱的指针域的值先赋值给插入结的指针域,然后再更改前驱结点指针域的值,否则会造成后续结点的丢失。在删除节点的过程中要注意备份一份要删除结点的地址以便后续空间的释放。
#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;
}//Of initLinkList
//遍历单链表
void printList(NodePtr paraHeader){
NodePtr p=paraHeader->next;
while(p!=NULL){
printf("%c",p->data);
p=p->next;
}//Of while
printf("\n");
}//Of printList
//在尾部添加一个元素
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;
}//Of while
//step3:插入
p->next = q;
}// Of appendElement
//插入一个元素
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 is beyond the scope of the list.",paraPosition);
return;
}//Of if
}//Of for i
//step 2:生成一个新节点
q=(NodePtr)malloc(sizeof(LNode));
q->data=paraChar;
//step 3:连接
printf("linking\n");
q->next =p->next;
p->next=q;
}//Of insertElement
//删除一个元素
void deleteElement(NodePtr paraHeader,char paraChar){
NodePtr p,q;
p = paraHeader;
while((p->next!=NULL)&&(p->next->data!=paraChar)){
p=p->next;
}// Of while
if(p->next == NULL){
printf("Cannot delete %c\n",paraChar);
return;
}//Of if
q=p->next;
p->next = p->next->next;
free(q);
}//Of deleteElement
//union text
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);
}// Of appendInsertDeleteTest
/**
*Address test:beyond the kook.
*/
void basicAddressTest(){
LNode tempNode1,tempNode2;
tempNode1.data=4;
tempNode1.next=NULL;
tempNode1.data=6;
tempNode1.next=NULL;
printf("The first node: %d, %d, %d\n",
&tempNode1,&tempNode1.data,&tempNode1.next);
printf("The second node: %d, %d, %d\n",
&tempNode2,&tempNode2.data,&tempNode2.next);
tempNode1.next=&tempNode2;
}// Of basicAddressTest
/**
*The entrace.进入
*/
int main(){
appendInsertDeleteTest();
}// Of main
运行结果: