链表的相关问题学习

来源:互联网 发布:阿里天池杯 交通大数据 编辑:程序博客网 时间:2024/05/22 13:22

前阵子做项目,在指针使用上出了点问题,为了复习指针的使用,写了关于链表的增删改查,以及有序链表在不增加空间的情况下的合并算法,现把代码总结如下,期待有高手给予指点~

#include<stdio.h>
#include<stdlib.h>
#define ERROR       0
#define SUCCESS     1
typedef struct Node{
 int value;  
struct Node *next;
}NODE;
void initlist(NODE **header);
void putlists(NODE *header);
int  unionlist(NODE **header,NODE *headerA,NODE *headerB);
void freenode(NODE **header);
int insertlist( NODE **header,int value,int index);
int deletelist( NODE **header,int index);
int modifylistnode( NODE *header,int index,int value);
int selectlistnode( NODE *header,int index, int *value);
int main(){
    NODE *headerA=NULL;
    //NODE *headerB=NULL;
    printf("Init headerA begin/n");
    initlist(&headerA);
    putlists(headerA);
    printf("Init headerA end/n");
/*********************************select begin*****************************/
    int index;
        printf("input index:/n");
    scanf("%d",&index);
    printf("input index end/n");
    int value=0;
        int status=selectlistnode(headerA,index-1,&value);
         if(status){
        printf("outputs value :%d/n",value);
    }
    freenode(&headerA);
/*********************************select end*******************************/

/*********************************modify begin*****************************
    int index;
        printf("input index:/n");
    scanf("%d",&index);
    printf("input index end/n");
    int value;
        printf("input value:/n");
    scanf("%d",&value);
    printf("input value end/n");
    int status=modifylistnode(headerA,index-1,value);
         if(status){
        printf("outputs value :/n");
        putlists(headerA); 
    }
    freenode(&headerA);
*********************************modify end*******************************/

/*********************************delete begin*****************************
    int index;
        printf("input index:/n");
    scanf("%d",&index);
    printf("input index end/n");
    int status=deletelist( &headerA,index-1);
         if(status){
        printf("outputs value :/n");
        putlists(headerA); 
    }
    freenode(&headerA);
*********************************delete end*******************************/

/*********************************insert begin******************************
    int value;
        printf("input value:/n");  
    scanf("%d",&value);
    printf("input value end/n");
    int index;
        printf("input index:/n");
    scanf("%d",&index);
    printf("input index end/n");
    int status=insertlist( &headerA,value,index-1);
         if(status){
        printf("outputs value :/n");
        putlists(headerA); 
    }
    freenode(&headerA);
*********************************insert end*******************************/

/*********************************union begin*****************************
printf("Init headerB begin/n");
    initlist(&headerB);
    putlists(headerB);
    printf("Init headerB end/n");
    printf("*************************unionlist begin***********************/n");
    NODE *header=NULL;
    int status =unionlist(&header,headerA,headerB);
    if(status){
    printf("*************************unionlist end*************************/n");
    printf("unionlist value:/n");
    putlists(header);
    printf("end/n");
    }
    else{
        printf("headerA and headerB all null!/n");
    }
    freenode(&header);
*********************************union end******************************/
    return 0;
}

void initlist(NODE **header)
{   int value=0;
    NODE *temp_header=NULL;
    do{
        scanf("%d",&value);
        if(value==0){
            break;
        }
        NODE *node;
        node=(NODE *)malloc(sizeof(NODE));
        node->value=value;
        node->next=NULL;
        if(temp_header==NULL){
            *header=node;
            temp_header=*header;   
           
        }
        else{
        temp_header->next=node;
        temp_header=temp_header->next;
        }
    } while(value!=0);
    printf("************************input the value of the list end************************/n");}
void putlists(NODE *header)
{
    while(header!=NULL){
       printf("**********node=%d/n",header->value);
        header=header->next;
   
    }
}


void freenode(NODE **header)
{
    NODE *temp_header=*header;
    NODE *temp_node=NULL;  
    while(temp_header!=NULL){
      temp_node=temp_header;
      temp_header=temp_header->next;
      free(temp_node);         
    }
}
int unionlist(NODE **header,NODE *headerA,NODE *headerB)
{
    NODE *temp_header=NULL;
    NODE *temp_node=NULL;
    NODE *node=NULL; 
    if((headerA==NULL) && (headerB==NULL))
        return ERROR;
        if(headerA==NULL){
        *header=headerB;
        return SUCCESS;
    }
        if(headerB==NULL){
        *header=headerA;
        return SUCCESS;
    }
    if((headerA->value) <= (headerB->value)){
        *header=headerA;
        temp_node=headerB;
    }
    else{
        *header=headerB;
        temp_node=headerA;
    }
    temp_header=*header;
    NODE *temp_nodefree;
    while((temp_header!=NULL) && (temp_node!=NULL)){
           
        if(temp_header->value < temp_node->value){         
            node=temp_header;
            temp_header=temp_header->next;     
            }
        else if((temp_header->value) ==(temp_node->value)){
            node=temp_header;
            temp_nodefree=temp_node;
            temp_node=temp_node->next;
            temp_header=temp_header->next; 
            free(temp_nodefree);
            }
         else{
            node->next=temp_node;
            temp_node=temp_node->next;
            temp_header=node->next;
        }
    }
    if((temp_header==NULL) && (temp_node!=NULL))
    {
    node->next=temp_node;
    }
    return SUCCESS;
}

int insertlist( NODE **header,int value,int index)
{
    if(value==0){
     printf("value error/n");
     return ERROR; 
    }
    int temp_index=0;
    NODE *temp_header=*header;
    NODE *temp_node=NULL;
    NODE *node=NULL;
        node=(NODE*)malloc(sizeof(NODE));
    node->value=value; 
    if(index==0){
        node->next=temp_header;
        *header=node;
        return SUCCESS;
    }
    while((temp_header != NULL) && (temp_index!=index)){
        temp_header=temp_header->next;
        temp_index++;
           
    }
    if(temp_index==index){
        temp_node=temp_header;
        temp_node->next=node;      
        node=temp_header;
    return SUCCESS;
    }
    printf("wrong index/n");
    return ERROR;     
}

int deletelist( NODE **header,int index)
{
    if(header==NULL){
        printf("header is not inited!/n"); 
        return ERROR;
    }
    int temp_index=0;
    NODE *temp_header=*header;
    NODE *temp_nodepriv=NULL;
    NODE *temp_node=NULL;
    if(index==0){
        *header=(*header)->next;
        temp_header->next=NULL;
        free(temp_header);
        return SUCCESS;
    }
    while((temp_header != NULL) && (temp_index!=index)){
        temp_nodepriv=temp_header;
        temp_header=temp_header->next;
        temp_index++;
           
    }
    if((temp_index==index)){
        temp_node=temp_header;
        if(temp_node->next ==NULL){
            temp_nodepriv->next=NULL;
            free(temp_node);
        return SUCCESS;        
        }  
           
        temp_header=temp_header->next; 
        free(temp_node);
        return SUCCESS;
    }
    if((temp_index==index)&&(temp_header->next==NULL)){
        temp_node=temp_header;
        temp_header=temp_header->next;
        temp_header->next=NULL;    
        free(temp_node);
        return SUCCESS;
    }
    printf("wrong index/n");
    return ERROR;     
}

int modifylistnode( NODE *header,int index, int value)
{
    int temp_index = 0;
    NODE *temp_header=header;
    while((temp_header!=NULL)){
        if(temp_index==index)
            {
                temp_header->value=value;                                      
                return SUCCESS;               
            }
        temp_header=temp_header->next;
        temp_index++;
    }
      printf("the length of the list is %d,you give the modify index is too big !/n",temp_index+1);
    return ERROR;
}

int selectlistnode( NODE *header,int index,int *value)
{
    int temp_index = 0;
    NODE *temp_header=header;
    while((temp_header!=NULL)){
        if(temp_index==index){
            *value=temp_header->value;
            return SUCCESS;                                    
        }
        temp_header=temp_header->next;
        temp_index++;
    }
      printf("the length of the list is %d,you give the modify index is too big !/n",temp_index+1);
    return ERROR;
}
 

原创粉丝点击