链表操作

来源:互联网 发布:信用卡网络限额增加 编辑:程序博客网 时间:2024/06/07 03:32
链表操作

#define N 20

定义链表的结构:
typedef struct Node{
    int data;
Node *next;
}Node,*LinkList;


//反转链表

int  reverLinkList(LinkList list){

LinkList newlist;

if(list==NULL||(newlist=(LinkList)malloc(sizeof(Node)))==NULL)

return 1;

 

Node *head=NULL;

head=list;


newlist->data=list->data;

newlist->next=NULL;


Node *temp=NULL;

//反转

while(list->next!=NULL){

temp=newlist;

newlist=list->next;

list->next=list->next->next;

newlist->next=temp;

}

printf("输出原链表\n");

list=head;

//输出原链表

while(list=NULL){

printf("%d\n",list->data);

list=list->next;

}

printf("输出新链表\n");

//输出新链表

while(newlist!=NULL){

printf("%d\n",newlist->data);

newlist=newlist->next;

}

return 0;

}

//合并两个有序链表
LinkList MergeTwoList(LinkList list1,LinkList list2){

LinkList newlist;

if((newlist=(LinkList)malloc(sizeof(Node)))==NULL)

return NULL;



if(list1==NULL)

return list2;

else if(list2==NULL)

return list1;


Node *head=NULL;

Node *temp=NULL;


while(list1!=NULL&&list2!=NULL){

 temp=new Node;

if(list1->data<list2->data){

temp->data=list1->data;

temp->next=NULL;

list1=list1->next;

}else{

temp->data=list2->data;

temp->next=NULL;

list2=list2->next;

}


if(head==NULL){

   head=temp;

   newlist=temp;

}else{

newlist->next=temp;

newlist=newlist->next;

}

if(list1==NULL)

newlist->next=list2;

if(list2==NULL)

newlist->next=list1;



/*if(head==NULL){

if(list1->data<list2->data){

head=list1;

newlist=list1;

list1=list1->next;

}else{

head=list2;

newlist=list2;

list2=list2->next;

}

}else{

if(list1->data<list2->data){

newlist->next=list1;

newlist=newlist->next;

list1=list1->next;

}else{

newlist->next=list1;

newlist=newlist->next;

list2=list2->next;

}

}*/


}

newlist=head;

printf("合并后的链表\n");

while(newlist!=NULL){

printf("%d\n",newlist->data);

newlist=newlist->next;

}

return newlist;

}


//打印链表

void print(LinkList list){

while(list!=NULL){

printf("%d\n",list->data);

list=list->next;

}

}

//创建链表
LinkList createLinkList(){

LinkList list;

if((list=(LinkList)malloc(sizeof(Node)))==NULL){

   printf("error");

   return NULL;

}


Node *head=NULL;

Node *p=NULL;


for(int i=0;i<20;i+=2){

p=new Node;

p->data=i;

p->next=NULL;


if(head==NULL){

head=p;

list=p;

}

else{

list->next=p;

list=list->next;

}

}



/*list=head;

printf("-----打印链表-----\n");

print(list);*/

list=head;


return list;

}

//在链表的尾部加入元素
LinkList addNode(LinkList list ,int value){

Node *head=NULL;

Node *p=NULL;



head=list;

p=new Node();

p->data=value;

p->next=NULL;


if(list==NULL){

 head=p; 

}

else{

while(list->next!=NULL){

list=list->next;

}

list->next=p;

}


return head;

}

//移除链表中的元素
LinkList removeNode(LinkList list,int value)
{
    Node *head=NULL;

head=list;


if(list==NULL){

 return list;

}


if(list->data==value){

list=list->next;

return list;

}


while(list->next!=NULL){

if(list->next->data!=value){

list=list->next;

}

else{

list->next=list->next->next;

break;

}

}


return head;

}

//从尾到头打印链表,非递归,借助栈来实现
void printlistrever(LinkList list){

Node *node;

std::stack<Node *> nodes;


while(list!=NULL){

nodes.push(list);

list=list->next;

}

while(!nodes.empty()){

node=nodes.top();

printf("%d\n",node->data);

nodes.pop();

}     

}


//从尾到头打印链表,递归
void printlistrever_recursion(LinkList list)

{

if(list!=NULL)

{

if(list->next!=NULL)

{

printlistrever_recursion(list->next);

}

 printf("%d\n",list->data);

}

}


int _tmain(int argc, _TCHAR* argv[])
{

LinkList list;

LinkList list2;



//产生链表

list=createLinkList();



printf("输出链表一\n");

print(list);


//在尾部添加元素

printf("-----尾部添加元素后输出链表一---\n");

list2=addNode(list,7);

print(list2);


//删除结点

//printf("-----删除结点---\n");

//print(removeNode(list2,0));


//从尾部打印结点

printf("-----从尾部打印结点---\n");

//printlistrever(list2);//非递归

printlistrever_recursion(list2);//递归


//反转

//reverLinkList(list);


//合并两个链表

//MergeTwoList(list,list2);


return 0;

}

0 0