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