欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C语言实现单链表的头插法、尾插法、链表翻转、删除节点和输出

程序员文章站 2024-03-22 11:20:52
...

C语言实现单链表的头插法、尾插法、链表翻转、删除节点和输出

1.首先创建单链表的结构体

typedef struct Node{
	int data;
	struct Node* next;
}Linklist;

2.创建头节点

//创建头结点
Linklist *creat(){// 创建一个链表,即创建一个头结点 
	Linklist *head;
	head=(Linklist *)malloc(sizeof(Linklist));//创建一个头结点
	head->next=NULL;
	return head; 
} 

3.头插法创建单链表

//头插法 
Linklist *head_insert(Linklist *head,int value){
	Linklist *p,*t;//h指向头结点,p用来创建即将要插入的节点 
	t=head;//t和head的变化是同步的 
	p=(Linklist *)malloc(sizeof(Linklist));
	p->data=value;
	p->next=t->next;  //t->next=NULL ;即把链尾指向NULL 
	t->next=p;
	return head;
}

4.尾插法创建单链表

// 尾插法
Linklist *tail_insert(Linklist *head,int value){ //
	Linklist *p,*t;
	t=head;
	p=(Linklist *)malloc(sizeof(Linklist));
	p->data=value;
	while(t->next!=NULL){
		t=t->next;
	}
	t->next=p;
	p->next=NULL; 
	return head; 	
} 

6.反转链表

/*翻转链表  
1.把链表头节点和第一个节点拆下来,
	p=head->next;
	t=p->next;
	p->next=NULL;
2.然后用头插法把原链表的节点插入到新的头结点(拆下来的头结点)
 */
Linklist *reverse(Linklist *head){
	Linklist *t,*p,*q; 
	p=head->next;
	t=p->next;//p->断开前部的最后一个节点 
	p->next=NULL;//把头结点和第一个节点拆下来,并把第一个结点指针置空;    
	while(t!=NULL){//循环头插  t->断开的后部第一个节点   
		q=t->next;//p保存t的后继节点,因为t要断开 
		t->next=head->next;//把t头插到新链表 
		head->next=t;// 
		t=q;//让t继续指向后部第一个节点 	
	} 
	return head; 	
}

##7.删除节点

//删除节点 
Linklist *delete_data(Linklist *head,int value){
	Linklist *p,*t,*e;//e保存删除节点 
	p=head; 
	if(head->next==NULL){
		cout<<"linklist is empty!"; 
	}
	while(p->next!=NULL){
	
		if(p->next->data==value){
		    e=p->next;//保存删除节点
			t=p->next->next;
			p->next=t;
			free(e); 
			p=t; 
		}	
		else{
				p=p->next;
		}
	}
	return head;	
}

9.输出链表元素

//输出链表
Linklist *display(Linklist *head){
	Linklist *p;
	p=head->next;
	if(p==NULL){
		printf("linklist is empty!");
		return 0;
	}
	while(p!=NULL){
		cout<<p->data<<"  ";
		p=p->next;
	}
	cout<<"\n";
    return head;		
} 

10 主函数测试

int main(){
	Linklist* head;//定义一个头指针 
	int i,num;
	head=creat();//返回创建了一个头节点的链表 
	
	printf("tail_insert :\n");
	for(i=i;i<10;i++){
		tail_insert(head,i);
	}
	display(head);
	
//	printf("reverse :\n");
//	reverse(head);
//    display(head);
    
    printf("delete :\n");
    int value=3;
    delete_data(head,value);
    display(head);
    
//	printf("head_insert :\n");
//	for(i=1;i<10;i++){
//		head_insert(head,i);	
//	}	
//	display(head);

	return 0;
}