单循环链表-c语言实现

//单循环链表

#include
#include

typedef struct node{
int data;
struct node *next;
}list;

list *create(){//建立单循环链表,返回尾指针
int x;
list *head,*p,*rear;
head=(list*)malloc(sizeof(list));
head->data=-1;
rear=head;
printf("请输入链表内容(整数),0作为结束:\n");
scanf("%d",&x);
while(x){
p=(list*)malloc(sizeof(list));
p->data=x;
rear->next=p;
rear=p;
scanf("%d",&x);
}
rear->next=head;
return(rear);
}



void print(list *rear){ //打印链表(遍历)
list *p;
printf("\n当前链表如下:\n");
p=rear->next->next;
while(p!=rear->next){
printf("%5d",p->data);
p=p->next;
}
printf("\n");
}

void delete_keyx(list *rear,int keyx){//删除给定值的节点
list *p,*q;
int deleted=0;//用于标记是否删除过
p=rear->next;
q=p->next;
while(q!=rear->next){
if(q->data==keyx){
p->next=q->next;
free(q);
q=p->next;
deleted=1;
}
p=q;
q=q->next;
}
if(deleted)
printf("已删除!\n");
else
printf("没有找到该节点!\n");
}


//给定值前插入新值
void insert_h(list *rear,int key,int x){
list *p,*q,*s;
s=(list*)malloc(sizeof(list));
s->data=x;
p=rear->next;
q=p->next;
while((q!=rear->next)&&q->data!=key){
p=q;
q=q->next;
}
if(q->data==key){
s->next=q;
p->next=s;
}
}


//在给定值之后插入新值
list *insert_r(list *rear,int key,int x){
list *q,*s;
s=(list*)malloc(sizeof(list));
s->data=x;
q=rear->next->next;
while((q!=rear->next)&&q->data!=key){
q=q->next;
}
if(q->data==key&&q==rear){
s->next=q->next;
q->next=s;
rear=s;
}
else if(q->data==key){
s->next=q->next;
q->next=s;
}
return rear;
}
//注意:后插需要讨论是否插入点在最后一个元素,若是,尾指针需要改变。




void main(){
//建立
list *rear;
int key,x;
rear=create();
print(rear);
//给定值前插入
printf("(前插)\n输入要 插入位置 的值:");
scanf("%d",&key);
printf("输入要 插入 的值:");
scanf("%d",&x);
insert_h(rear,key,x);
print(rear);
//给定值后插入
printf("(后插)输入要 插入位置 的值:");
scanf("%d",&key);
printf("输入要 插入 的值:");
scanf("%d",&x);
rear=insert_r(rear,key,x);
print(rear);
//删除给定值的结点
printf("输入要删除的值:");
scanf("%d",&key);
delete_keyx(rear,key);
print(rear);

}

相关主题
相关文档
最新文档