#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
//初始化链表
LinkList create(LinkList &l){
l=(LinkList)malloc(sizeof(LNode));
l->next=NULL;
int k; LNode *p;
p=l;
printf("请输入数字\n");
scanf("%d",&k);
//LNode *newnode;
while(k!=9999){
LNode *newnode=(LNode*)malloc(sizeof(LNode));
newnode->data=k;
newnode->next=NULL;
p->next=newnode;
p=newnode;
printf("请输入数字\n");
scanf("%d",&k);
}
p->next=NULL;
return l;
}
//遍历链表
void display(LinkList l){
LNode *node=l->next;
while(node!=NULL){
printf("%d\n",node->data);
node=node->next;
}
}
//按值查找
LNode *search1(LinkList l,int i){
LNode *node=l->next;
while(node!=NULL&&node->data!=i){
node=node->next;
}
return node;
}
//按序号查找
LNode *search2(LinkList l,int i){
int j=1;
LNode *node=l->next;
while(node!=NULL&&j<i){
node=node->next;
j++;
}
return node;
}
//前插操作
LinkList insertbefore(LinkList &l,int k,int num){
LNode *newnode=(LNode*)malloc(sizeof(LNode));
newnode->data=k;
newnode->next=NULL;
//LNode *node=l->next;
LNode *p=search2(l,num-1);//在这个结点后面插入
newnode->next=p->next;
p->next=p;
return l;
}
//后插操作
LinkList insertafter(LinkList &l,int k,int num){
LNode *newnode=(LNode*)malloc(sizeof(LNode));
newnode->data=k;
newnode->next=NULL;
//LNode *node=l->next;
LNode *p=search2(l,num-1);//在这个结点后面插入
newnode->next=p->next;
p->next=p;
return l;
}
//按照值进行删除操作
void delete1(LinkList l,int i){
LNode *node=l->next;
LNode *pre=l;
while(node!=NULL&&node->data!=i){
pre=node;
node=node->next;
}
pre->next=node->next;
free(node);
}
//按序号删除操作
void delete2(LinkList l,int i){
LNode *node=search2(l,i-1);
LNode *p=node->next;
node->next=p->next;
free(p);
}
//删除所有值为x的结点
void delete3(LinkList l,int x){
LNode *node=l->next;
LNode *pre=l;
while(node!=NULL){
if(node->data==x){
LNode *deletenode=node;
pre->next=node->next;
node=node->next;
free(deletenode);
}else{
pre=node;
node=node->next;
}
}
}
//从尾到头反向输出(栈的思想)
void opposedisplay(LinkList l){
//LNode *node=l->next;
if(l->next!=NULL){
opposedisplay(l->next);
}
printf("%d\n",l->data);
}
//删除最小值结点
void deletemin(LinkList l){
LNode *node=l->next;
int min=node->data;
LNode *minnode=l->next; LNode *minpre=l; LNode *pre=l;
while(node!=NULL){
if(node->data<min){
min=node->data;
minnode=node;
minpre=pre;
pre=node;
node=node->next;
}else{
pre=node;
node=node->next;
}
}
minpre->next=minnode->next;
free(minnode);
//printf("%d\n",l->data);
}
//将整个链表逆置(需要加强复习)
LinkList oppose(LinkList l){
//LNode *node=l->next;
LNode *p=l->next;LNode *r;
l->next=NULL;
while(p!=NULL){
r=p->next;
p->next=l->next;
l->next=p;
p=r;
}
return l;
}
//将整个链表有序递增 可以将值放到数组之中(需要加强复习)
LinkList increase(LinkList l){
LNode *node=l->next;
LNode *pre;
LNode *r=node->next;
node->next=NULL;
node=r;
while(node!=NULL){
r=node->next;
pre=l;
while(pre->next!=NULL&&pre->next->data<node->data)
pre=pre->next;
node->next=pre->next;
pre->next=node;
node=r;
}
}
//删除值在a到b之间的结点
void deletebetween(LinkList l,int a,int b){
LNode *node=l->next;
LNode *pre=l;
while(node!=NULL){
if(l->data>a&&l->data<b){
LNode *p=node;
pre->next=node->next;
node=node->next;
free(p);
}else{
pre=node;
node=node->next;
}
}
}
//递增次序输出各节点元素(不允许用数组) (找最大值然后释放元素)
void displayincreasse(LinkList l){
}
//两个链表递增,归并为一个递减的单链表
LinkList combine(LinkList &l,LinkList &l1,LinkList &l2){
//LinkList l=(LinkList)malloc(sizeof(LNode));
l=(LinkList)malloc(sizeof(LNode));
l->next=NULL;
LNode *p1=l1->next;
LNode *p2=l2->next;
LNode *r;
while(p1!=NULL&&p2!=NULL){
//LNode *node=l->next;
printf("p1的数值是%d,p2的数值是%d",p1->data,p2->data);
if(p1->data<p2->data){
r=p1->next;
p1->next=l->next;
l->next=p1;
p1=r;
printf("进来此处%d\n",l->next->data);
}else{
r=p2->next;
p2->next=l->next;
l->next=p2;
p2=r;
printf("进来z这里%d\n",l->next->data);
}
}
//LNode *node2=l->next;
if(p1!=NULL){
while(p1!=NULL){
r=p1->next;
p1->next=l->next;
l->next=p1;
p1=r;
}
}else{
while(p2!=NULL){
r=p2->next;
p2->next=l->next;
l->next=p2;
p2=r;
}
}
return l;
}
int main(){
LinkList l,l1,l2;
//create(l);
//deletemin(l);
//oppose(l);
l1=create(l1);
display(l1);
l2=create(l2);
display(l2);
l=combine(l, l1, l2);
display(l);
//increase(l);
//LNode *p1=search1(l,23);
//printf("%d\n",p1->data);
//LNode *p2=search2(l,2);
//printf("第二个值是%d\n",p2->data);
//opposedisplay(l);
//delete3(l,23);
//display(l);
//delete2(l,3);
//display(l);
return 1;
}