//带头节点的单链表操作
#include<iostream>
#include<stdlib.h>
using namespace std;
typedef int type;
typedef struct node{
type data;
struct node *next;
} Node,*LinkNode;
//初始化头节点
void init(LinkNode &head)
{
head=(LinkNode)malloc(sizeof(Node));
head->next=NULL;
}
//头插法
LinkNode createR(){
type x;
cin>>x;
LinkNode head,s;
init(head);
while(x!=-1){
LinkNode s=(LinkNode)malloc(sizeof(Node));
s->data=x;
s->next=head->next;
head->next=s;
cin>>x;
}
return head;
}
//尾插法
LinkNode createF(){
LinkNode head,s,p;
init(head);
p=head;
type x;
cin>>x;
while(x!=-1){
s=(LinkNode) malloc(sizeof(Node));
s->data=x;
s->next=NULL;
p->next=s;
p=s;
cin>>x;
}
return head;
}
//判断链表是否为空
int isEmpty(LinkNode head){
return head->next==NULL;
}
//销毁整个链表
void destory(LinkNode &head){
LinkNode p;
while(head){
p=head->next;
free(head);
head=p;
}
}
//返回链表长度
int length(LinkNode head){
if(isEmpty(head)) return 0;
LinkNode p=head->next;
int t=0;
while(p){
t++;
p=p->next;
}
return t;
}
//在指定序号插入元素
int insertElem(LinkNode head,int p,type x){
if(isEmpty(head)||p>length(head)||p<0) return 0;
LinkNode q=head->next;
for(int i=0;i<p-1;i++)
q=q->next;
LinkNode s=(LinkNode) malloc(sizeof(Node));
s->data=x;
s->next=q->next;
q->next=s;
return 1;
}
//查找指定位置的元素并返回
type getElem(LinkNode head,int p){
if(isEmpty(head)||p>=length(head)||p<0) return -1;
LinkNode q=head->next;
int i=0;
while(p&&i!=p)
{
q=q->next;
i++;
}
return q->data;
}
//找指定元素的位置
int findElem(LinkNode head,type x){
if(isEmpty(head)) return -1;
LinkNode p=head->next;
int i=0;
while(p&&p->data!=x){
i++;
p=p->next;
}
if(p==NULL) return -1;
return i;
}
//删除链表中出现的所有 元素 x
int deleteElem(LinkNode head,type x){
if(isEmpty(head)) return -1;
LinkNode p=head->next;
LinkNode q=head;
LinkNode l;
while(p->next){
if(p->data==x){
l=p->next;
p->data=l->data;
p->next=l->next;
free(l);
}else{
p=p->next;
q=q->next;
}
}
if(p->data==x){ //应对需要删除的元素是最后一个结点的情况
q->next=NULL;
free(p);
}
return 1;
}
//删除指定位置的结点
int deleteElem_p(LinkNode head,int p){
if(isEmpty(head)||p>=length(head)||p<0) return -1;
LinkNode q=head->next;
LinkNode l=head;
int i=0;
while(q->next&&i!=p){
q=q->next;
l=l->next;
i++;
}
l->next=q->next;
free(q);
return 1;
}
//就地逆转带头节点的链表
LinkNode reverse(LinkNode head){
LinkNode newhead;
init(newhead);
LinkNode p=newhead,q=head->next,l;
while(q){
l=q->next;
q->next=newhead->next;
newhead->next=q;
q=l;
}
return newhead;
}
//打印链表
void print(LinkNode head){
if(isEmpty(head)) {
cout<<-1<<endl;
return ;
}
LinkNode p=head->next;
while(p)
{
cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
int main(){
LinkNode head=createR();
print(head);
//LinkNode head1=createF();
//print(head1);
// cout<<isEmpty(head)<<endl;
// insertElem(head,2,18);
//
// print(head);
// cout<<length(head)<<endl;
// cout<<findElem(head,2)<<endl;
// cout<<getElem(head,4)<<endl;
// cout<<deleteElem(head,2)<<endl;
// print(head);
// deleteElem_p(head,3);
// print(head);
//destory(head);
LinkNode newhead=reverse(head);
print(newhead);
return 0;
}
Basic data structure - single linked list
Guess you like
Origin blog.csdn.net/Unknow_if/article/details/117452494
Recommended
Ranking