|
3.链表节点的插入 4.链表节点的删除
3.链表节点的插入
解: 1) 首先声明一个新节点供输入要插入节点的内容 2) 由用户输入一个节点内容(Key),表示欲插入在哪一个节点之后 3) 持续往下一个节点,直到节点内容Key或节点指针为NULL为止(即找不到该节点) 4) 如果该节点不存在,则插入在节点前 New->Next=Head Head=New 5) 如果找到该节点,则 New->Next=Pointer->Next Pointer->Next=New *程序代码如下: #include<stdlib.h> #include<stdio.h> #define Max 10 struct List /*节点结构声明*/ { int Number; int Total; struct List *Next; }; typedef struct List Node; typedef Node *Link; int Data[2][Max]={1,3,5,7,2,4,6,8,9,0,15,35,10,67,25,65,38,70,30,20}; /*插入节点至链表内*/ Link Insert_List(Link Head,Link New,int Key) { Link Pointer; /*声明节点*/ Pointer=Head; /*Pointer指针设为首节点*/ while(1) { if(Pointer==NULL) /*插入在首节点前*/ { New->Next=Head; Head=New; break; } if(Pointer->Number==Key) /*插入在链表中间或尾端*/ { New->Next=Pointer->Next; Pointer->Next=New; break; } Pointer=Pointer->Next; /*指向下一个节点*/ } return Head; } /*输出链表数据*/ void Print_List(Link Head) { Link Pointer; /*节点声明*/ Pointer=Head; /*Pointer指针设为首节点*/ while(Pointer!=NULL) /*当节点为NULL结束循环*/ { printf("[%d,%d]",Pointer->Number,Pointer->Total); Pointer=Pointer->Next; /*指向下一个节点*/ } printf("\n"); } /*释放链表*/ void Free_List(Link Head) { Link Pointer; /*节点声明*/ while(Head!=NULL) /*当节点为NULL结束循环*/ { Pointer=Head; Head=Head->Next; free(Pointer); } } /*建立链表*/ Link Create_List(Link Head) { Link New; /*节点声明*/ Link Pointer; /*节点声明*/ int i; Head=(Link)malloc(sizeof(Node)); /*分配内存*/ if(Head==NULL) printf("Memory allocate Failure!\n"); /*内存分配失败*/ else { Head->Number=Data[0][0]; /*定义首节点数据编号*/ Head->Total=Data[1][0]; Head->Next=NULL; Pointer=Head; /*Pointer指针设为首节点*/ for(i=1;i<Max;i++) { New=(Link)malloc(sizeof(Node)); /*分配内存*/ New->Number=Data[0][i]; New->Total=Data[1][i]; New->Next=NULL; Pointer->Next=New; /*将新节点串连在原列表尾端*/ Pointer=New; /*列表尾端节点为新节点*/ } } return Head; } /*主程序*/ void main() { Link Head; /*节点声明*/ Link New; int Key; Head=Create_List(Head); /*建立链表*/ if(Head!=NULL) { Print_List(Head); while(1) { printf("Input 0 to Exit\n"); /*数据输入提示*/ New=(Link)malloc(sizeof(Node)); /*分配内存*/ printf("Please input Data number:"); scanf("%d",&New->Number); if(New->Number==0) /*输入0时结束循环*/ break; printf("Please input the data total:"); scanf("%d",&New->Total); printf("Please input the data number for Insert:"); scanf("%d",&Key); Head=Insert_List(Head,New,Key); /*插入节点*/ Print_List(Head); /*输出链表数据*/ } Free_List(Head); /*释放链表*/ } } *程序运行结果如下: ------------------------------------------------------------------
4.链表节点的删除 解: 持续往下一个节点查找要删除的节点,直到节点内容找到或节点指针为NULL(即找不到该节点)。 在删除时,必须记录前一个节点的位置(Back) 如果该节点不存在,输出一个节点不存在的提示 如果该节点存在,且是首节点: Head=Pointer->Next free(Pointer) 如果该节点存在,但不是首节点(即链表内节点或尾端节点),则: Back->Next=Pointer->Next free(Pointer) *程序代码如下: #include<stdio.h> #include<stdlib.h> #define Max 10 struct List /*节点结构声明 */ { int Number; int Total; struct List *Next; }; typedef struct List Node; typedef Node *Link; int Data[2][Max]={1,3,5,7,2,4,6,8,9,10,15,35,10,67,25,65,38,70,30,20}; /*删除链表内节点*/ Link Delete_List(Link Head,int Key) { Link Pointer; /*节点声明*/ Link Back; Pointer=Head; /*Pointer 指针设为首节点*/ while(1) { if(Pointer->Next==NULL) { printf("Not Found!\n"); break; } if(Head->Number==Key) /*删除首节点*/ { Head=Pointer->Next; free(Pointer); break; } Back=Pointer; Pointer=Pointer->Next; /*指向下一个节点*/ if(Pointer->Number==Key) /*插入在链表中间或尾端*/ { Back->Next=Pointer->Next; free(Pointer); break; } } return Head; } /*输出链表数据*/ void Print_List(Link Head) { Link Pointer; /*节点声明*/ Pointer=Head; /*Pointer指针设为首节点*/ while(Pointer!=NULL) /*当节点为NULL结束循环*/ { printf("[%d,%d]",Pointer->Number,Pointer->Total); Pointer=Pointer->Next; /*指向下一个节点*/ } printf("\n"); } /*释放链表*/ void Free_List(Link Head) { Link Pointer; /*节点声明*/ while(Head!=NULL) /*当节点为NULL结束循环*/ { Pointer=Head; Head=Head->Next; /*指向下一个节点*/ free(Pointer); } } /*建立链表*/ Link Create_List(Link Head) { Link New; /*节点声明*/ Link Pointer; int i; Head=(Link)malloc(sizeof(Node)); /*分本内存*/ if(Head==NULL) printf("Memory allocate Failure!\n"); /*内存分配失败*/ else { Head->Number=Data[0][0]; /*定义首节点数据编号*/ Head->Total=Data[1][0]; Head->Next=NULL; Pointer=Head; /*Pointer指针设为首节点*/ for(i=1;i<Max;i++) { New=(Link)malloc(sizeof(Node)); /*分配内存*/ New->Number=Data[0][i]; New->Total=Data[1][i]; New->Next=NULL; Pointer->Next=New; /*将新节点串连在原列表尾端*/ Pointer=New; /*列表尾端节点为新节点*/ } } return Head; } /*主程序*/ void main() { Link Head=NULL; /*节点声明*/ int Key; Head=Create_List(Head); /*建立链表*/ if(Head!=NULL) { Print_List(Head); while(1) { printf("Input 0 to exit\n"); /*数据输入提示*/ printf("Please input the data number for Delete:"); scanf("%d",&Key); if(Key==0) /*时结束循环*/ break; Head=Delete_List(Head,Key); /*删除节点*/ Print_List(Head); /*输出链表*/ } Free_List(Head); /*释放链表*/ } }
*程序运行结果如下:
|
|