单链表的静态创建、动态创建(头插法、尾插法)及增删改操作
#include <stdio.h>
#include <stdlib.h>
/*链表-普通结构体的应用
定义:
灵活的数据结构(数据存放的思想)
数组为连续内存空间的数据结构,增删改不灵活,运算量大
*/
//自定义链表节点结构体,定义为Node类型
typedef struct node_link{
char data;
struct node_link *next;
}Node;
//链表遍历输出 in:Node *head ;out:void
void printfLink(Node *head){
Node *node=head;
while(node!=NULL){
printf(" %d ",node->data);
node=node->next;
}
printf("\n");
}
/*插入节点:节点前方插入;节点后方插入
in:Node *head,int data,Node *new_node
out:*head;
链表的头节点可以确定整个链表
*/
Node* insertFromForward(Node *head,int data,Node *new_node){
Node *node=head;
if(data==head->data){
new_node->next=head;
printfLink(new_node);
return new_node;
}
while(node!=NULL){
if(data==node->next->data){
new_node->next=node->next;
node->next=new_node;
printfLink(head);
return head;
}
node=node->next;
}
}
Node* insertFromBehide(Node *head,int data,Node *new_node){
Node *node=head;
while(node!=NULL){
if(node->data==data){
new_node->next=node->next;
node->next=new_node;
printfLink(head);
return head;
}
node=node->next;
}
}
//删除节点
Node* deleteNode(Node* head,int data){
Node* node=head;
while(node!=NULL){
if(node->next->data==data){
node->next=node->next->next;
printfLink(head);
return head;
}
node=node->next;
}
}
//更新节点值
Node* updateNode(Node *head,int data,int new_data){
Node *node=head;
while(node!=NULL){
if(node->data==data){
node->data=new_data;
printfLink(head);
return head;
}
node=node->next;
}
printf("the data is not in Link\n");
return head;
}
/*
动态创建链表
头插法
尾插法
一个一个插入,输入0结束
*/
Node* insertFromHead(Node *head,Node *new_node){
//printf("Head\n");
if(head==NULL){
head=new_node;
}
else{
new_node->next=head;
head=new_node;
}
return head;
}
Node* insertFromTail(Node *head,Node *new_node){
//printf("Tail");
Node *node=head;
if(head==NULL){
head=new_node;
}
else{
while(node!=NULL){
if(node->next==NULL){
node->next=new_node;
return head;
}
node=node->next;
}
}
return head;
}
Node* creatLink(Node *head,char flag[]){
Node *new_node=NULL;
printf("the src link is ");
printfLink(head);
while(1){
new_node=(Node*)malloc(sizeof(Node));//开辟内存空间并指向其首地址;
printf("please input your new node data\n");
scanf("%d",&(new_node->data));
new_node->next=NULL;//无修改则默认为尾结点
if(new_node->data==0){
free(new_node);
printf("0:quit; creat link by %s, link result is ",flag);
printfLink(head);
return head;
}
if(flag=="Head")
head=insertFromHead(head,new_node);
if(flag=="Tail")
head=insertFromTail(head,new_node);
}
}
int main()
{
/*链表静态创建*/
//创建节点
Node node1={1,NULL};
Node node2={2,NULL};
Node node3={3,NULL};
//将节点链起来
node1.next=&node2;
node2.next=&node3;
//printf("node1's data %d; node2's data %d;\n",node1.data,node1.next->data);//变量名用.,指针用->访问成员
printfLink(&node1);//遍历打印
/*增加节点*/
Node node4={100,NULL};
Node *head=&node1;
head=insertFromForward(&node1,1,&node4);//返回的是一个指针(地址)
Node node5={101,NULL};
head=insertFromForward(&node1,3,&node5);
Node node6={103,NULL};
head=insertFromBehide(&node1,3,&node6);
/*删除节点*/
head=deleteNode(&node1,103);
/*改变节点值*/
head=updateNode(&node1,103,10);
head=updateNode(&node1,101,10);
/*链表动态创建*/
Node *head1=NULL;
char *flag="Head";
//头插法
printf("head insert\n");
head1=creatLink(head1,flag);
//尾插法
printf("tail insert\n");
flag="Tail";
head1=creatLink(head1,flag);
system("pause");
return 0;
}