如何用c语言创建链表和输入一个新链表
#include "stdlib。h" #include "stdio。h"struct listNode{ int data; struct listNode *nextPtr; };typedef struct listNode LISTNODE;typedef LISTNODE * LISTNODEPTR;/*LISTNODEPTR£ºÖ¸ÏòLISTNODEÖ¸Õë*/LISTNODE * createFIFOList1();LISTNODEPTR createFILOList();void createFIFOList2(LISTNODEPTR *);void printList...全部
#include "stdlib。h" #include "stdio。h"struct listNode{ int data; struct listNode *nextPtr; };typedef struct listNode LISTNODE;typedef LISTNODE * LISTNODEPTR;/*LISTNODEPTR£ºÖ¸ÏòLISTNODEÖ¸Õë*/LISTNODE * createFIFOList1();LISTNODEPTR createFILOList();void createFIFOList2(LISTNODEPTR *);void printList(LISTNODEPTR );void destroyList(LISTNODEPTR);LISTNODEPTR find(LISTNODEPTR currentPtr, int value);void insertNode(LISTNODEPTR *sPtr,int value);LISTNODEPTR createSortList();int deleteNode(LISTNODEPTR *sPtr, int value);void printListR(LISTNODEPTR currentPtr);void printListS(LISTNODEPTR currentPtr);LISTNODEPTR findMax(LISTNODEPTR headPtr);LISTNODEPTR findMaxR(LISTNODEPTR headPtr);LISTNODEPTR reverseList(LISTNODEPTR headPtr);LISTNODEPTR reverseList2(LISTNODEPTR headPtr);LISTNODEPTR reverseList3(LISTNODEPTR headPtr); void findPos(LISTNODEPTR headPtr,int value,LISTNODEPTR * previousPtr,LISTNODEPTR * currentPtr);LISTNODEPTR mergeSortList(LISTNODEPTR head1Ptr,LISTNODEPTR head2Ptr);main(){ LISTNODEPTR headPTR = NULL; int data; LISTNODEPTR point; int type; int result; // headPTR = createFIFOList1(); // createFIFOList2(&headPTR);// printList(headPTR); headPTR = createSortList(); printList(headPTR); /* printf("ÇëÊäÈëÒª·þÎñµÄÖÖÀࣺ0, ´òÓ¡£¬1 ²éÕÒ£¬2 ²åÈ룬3 ɾ³ý£¬4 ÄæÐò´òÓ¡, 5 ÕÒ×î´óÊý, 6 ÄæתÁ´±í£¬7 Á´±í¹é²¢£¬-1½áÊø£º
"); scanf("%d", &type); while(type != -1) { switch(type) { case 0: { printListS(headPTR); break; } case 4: { printListR(headPTR); break; } case 1: { printf("ÇëÊäÈëÒª²éÕÒµÄÊý¾Ý£º"); scanf("%d", &data); if(point = find(headPTR, data)) printf("%d
", point->data); else printf("ûÓÐÕÒµ½
"); break; } case 2: { printf("ÇëÊäÈëÒª²åÈëµÄÊý¾Ý£º"); scanf("%d", &data); insertNode(&headPTR, data); break; } case 3: { printf("ÇëÊäÈëҪɾ³ýµÄÊý¾Ý£º"); scanf("%d", &data); result = deleteNode(&headPTR, data); printf("ɾ³ýµÄ½á¹ûΪ£º%d
", result); break; } case 5: { LISTNODEPTR resultPtr = findMax(headPTR); printf("×î´óֵΪ£º%d
", resultPtr->data); break; } case 6: { LISTNODEPTR resultPtr = reverseList2(headPTR); printListS(resultPtr); break; } case 7: { LISTNODEPTR headPtr2 = createSortList(); printList(headPtr2); headPTR = mergeSortList(headPTR, headPtr2); printList(headPTR); break; } } printf("
ÇëÊäÈëÒª·þÎñµÄÖÖÀࣺ0, ´òÓ¡£¬1 ²éÕÒ£¬2 ²åÈ룬3ɾ³ý£¬4ÄæÐò´òÓ¡£¬5 ÕÒ×î´óÊý£¬6 ÄæתÁ´±í£¬7 Á´±í¹é²¢£¬ -1½áÊø£º
"); scanf("%d", &type); }destroyList(headPTR); */ system("pause");}LISTNODE * createFIFOList1(){ int num; LISTNODEPTR headPtr=NULL,lastPtr=NULL,currentPtr=NULL; printf("input positive numbers,-1 to end
"); scanf("%d",&num); while(num!=-1) { currentPtr=malloc(sizeof(LISTNODE)); /*·ÖÅä½áµãÄÚ´æ*/ if(currentPtr!=NULL) {/*²åÈë½áµã*/ currentPtr->data=num; currentPtr->nextPtr = NULL; if(headPtr==NULL) { /*ÈôcurrentPtrÊÇÍ·½áµã*/ headPtr=currentPtr; lastPtr=currentPtr; } else { lastPtr->nextPtr=currentPtr; /*½«½áµãÁ¬ÉÏÁ´±íβ½áµã*/ lastPtr=currentPtr; /*ʹlastPtrÖ¸Ïòµ±Ç°Á´±íµÄ×îºóÒ»¸ö½áµã*/ } } scanf("%d",&num); } // lastPtr->nextPtr=NULL;/*ÉèÖÃÁ´±í½áÊø±ê¼Ç*/ return headPtr; }void createFIFOList2(LISTNODEPTR *sPTR){ int num; LISTNODEPTR headPtr=NULL,lastPtr=NULL,currentPtr=NULL; printf("input positive numbers,-1 to end
"); scanf("%d",&num); while(num!=-1) { currentPtr=malloc(sizeof(LISTNODE)); /*·ÖÅä½áµãÄÚ´æ*/ if(currentPtr!=NULL) {/*²åÈë½áµã*/ currentPtr->data=num; if(headPtr==NULL) { /*ÈôcurrentPtrÊÇÍ·½áµã*/ headPtr=currentPtr; lastPtr=currentPtr; } else { lastPtr->nextPtr=currentPtr; /*½«½áµãÁ¬ÉÏÁ´±íβ½áµã*/ lastPtr=currentPtr; /*ʹlastPtrÖ¸Ïòµ±Ç°Á´±íµÄ×îºóÒ»¸ö½áµã*/ } } scanf("%d",&num); } lastPtr->nextPtr=NULL;/*ÉèÖÃÁ´±í½áÊø±ê¼Ç*/ *sPTR = headPtr; }LISTNODEPTR createFILOList(){ LISTNODEPTR headPTR, currentPTR; int num; headPTR = NULL; currentPTR = NULL; printf("input positive numbers,-1 to end
"); scanf("%d",&num); while(num!=-1) { currentPTR = (LISTNODEPTR)malloc(sizeof(LISTNODE)); if(currentPTR != NULL) { currentPTR->data = num; if(headPTR == NULL) { headPTR = currentPTR; headPTR->nextPtr = NULL; } else { currentPTR->nextPtr = headPTR; headPTR = currentPTR; } } scanf("%d", &num); } return headPTR;}void printList(LISTNODEPTR currentPtr){ if(currentPtr==NULL) printf("the list is empty
"); else { printf("the list is:
"); while(currentPtr!=NULL) { printf("%d-->",currentPtr->data); currentPtr=currentPtr->nextPtr; } printf("NULL
"); }}void destroyList(LISTNODEPTR headPtr){ LISTNODEPTR tempPtr; while(headPtr!=NULL) { tempPtr=headPtr; headPtr=headPtr->nextPtr;/*headPtrÖ¸ÏòÏÂÒ»¸öÒª ɾ³ýµÄ½áµã*/ free(tempPtr); }} LISTNODEPTR find(LISTNODEPTR currentPtr, int value){ while(currentPtr != NULL && currentPtr->data != value) { currentPtr = currentPtr->nextPtr; } return currentPtr;} void insertNode(LISTNODEPTR *sPtr,int value) { LISTNODEPTR newPtr, previousPtr, currentPtr; newPtr = (LISTNODEPTR)malloc(sizeof(LISTNODE)); if(newPtr != NULL) { newPtr->data = value; newPtr->nextPtr = NULL; previousPtr = NULL; currentPtr = *sPtr; while(currentPtr != NULL && currentPtr->data nextPtr; } if(currentPtr == *sPtr) { *sPtr = newPtr; newPtr->nextPtr = currentPtr; } else if(currentPtr == NULL) { previousPtr->nextPtr = newPtr; } else { previousPtr->nextPtr = newPtr; newPtr->nextPtr = currentPtr; } }}LISTNODEPTR createSortList(){ int num; LISTNODEPTR headPtr = NULL; printf("ÇëÊäÈëÕûÊýÒÔ-1Ϊ½áÊø£º
"); scanf("%d", &num); while(num != -1) { insertNode(&headPtr, num); scanf("%d", &num); } return headPtr;}int deleteNode(LISTNODEPTR *sPtr, int value){ LISTNODEPTR previousPtr, currentPtr; previousPtr = NULL; currentPtr = *sPtr; while(currentPtr != NULL && currentPtr->data != value) { previousPtr = currentPtr; currentPtr = currentPtr->nextPtr; } if(currentPtr != NULL) { if(previousPtr == NULL) { *sPtr = currentPtr->nextPtr; } else previousPtr->nextPtr = currentPtr->nextPtr; free(currentPtr); return value; } else return -1;}void printListS(LISTNODEPTR currentPtr){ if(currentPtr->nextPtr == NULL) printf("%d->", currentPtr->data); else { printf("%d->", currentPtr->data); printListS(currentPtr->nextPtr); }}void printListR(LISTNODEPTR currentPtr){ if(currentPtr->nextPtr == NULL) printf("%d->", currentPtr->data); else { printListR(currentPtr->nextPtr); printf("%d->", currentPtr->data); }}LISTNODEPTR findMax(LISTNODEPTR headPtr){ LISTNODEPTR maxPtr, currentPtr; maxPtr = headPtr; currentPtr = headPtr->nextPtr; while(currentPtr) { if(currentPtr->data > maxPtr->data) { maxPtr = currentPtr; } currentPtr = currentPtr->nextPtr; } return maxPtr;}LISTNODEPTR findMaxR(LISTNODEPTR headPtr){ LISTNODEPTR maxPtr; if(headPtr->nextPtr == NULL) return headPtr; else { maxPtr = findMaxR(headPtr->nextPtr); return headPtr->data>maxPtr->data?headPtr:maxPtr; } } LISTNODEPTR reverseList(LISTNODEPTR headPtr){ LISTNODEPTR newHeadPtr, currentPtr; newHeadPtr = NULL; currentPtr = NULL; while(headPtr) { currentPtr = headPtr; headPtr = currentPtr->nextPtr; if(newHeadPtr == NULL) { newHeadPtr = currentPtr; currentPtr->nextPtr = NULL; } else { currentPtr->nextPtr = newHeadPtr; newHeadPtr = currentPtr; } } return newHeadPtr;}LISTNODEPTR reverseList2(LISTNODEPTR headPtr){ LISTNODEPTR previousPtr, currentPtr, nextPtr; previousPtr = NULL; currentPtr = headPtr; while(currentPtr != NULL) { nextPtr = currentPtr->nextPtr; currentPtr->nextPtr = previousPtr; previousPtr = currentPtr; currentPtr = nextPtr; } return previousPtr;}LISTNODEPTR reverseList3(LISTNODEPTR headPtr){ LISTNODEPTR lastPtr=NULL,currentPtr=NULL; if(headPtr->nextPtr==NULL){//ÈôÊÇ×îºóÒ»¸ö½áµã£¬ÔòÖ±½Ó·µ»Ø return headPtr; } else{ /*1。
µ±Ç°Á´±íÍ·½áµã´ÓÁ´±íÖвð³ý£¬ÓÉlastPtrÖ¸Ïò£¬½«³ÉΪÄæÐòºóµÄÁ´±íβ½áµã¡£headPtrÖ¸ÏòÏÂÒ»½áµã*/ lastPtr=headPtr; headPtr=headPtr->nextPtr; lastPtr->nextPtr=NULL; /*2。
µÝ¹éµ÷Ó㬽«headPtrÖ¸ÏòµÄÁ´±íÄæÐò£¬ÓÉnewHeadPtrÖ¸Ïò */ headPtr=reverseList(headPtr); /*3。 ½«lastPtrÖ¸Ïò½áµãÁ´½Óµ½newHeadPtrÖ¸ÏòÁ´±íµÄβ½áµãÖ®ºó*/ currentPtr=headPtr; while(currentPtr->nextPtr!=NULL)//Èô²»ÊÇ×îºó½áµã currentPtr=currentPtr->nextPtr; currentPtr->nextPtr=lastPtr; //½«Î²½áµãÁ´½Óµ½Á´±í return headPtr; } }LISTNODEPTR mergeSortList(LISTNODEPTR head1Ptr,LISTNODEPTR head2Ptr){ LISTNODEPTR left2Ptr,previous1Ptr,current1Ptr,previous2Ptr,current2Ptr; while(head2Ptr!=NULL) { previous1Ptr=NULL; current1Ptr=NULL; previous2Ptr=NULL; current2Ptr=NULL; left2Ptr=head2Ptr; /*1。
ÕÒ²åÈëλÖ㺸ù¾ÝÁ´±í2µÄµ±Ç°ÔªËØÕÒµ½ÔÚÁ´±í1µÄ²åÈëλÖÃ,½«²å Èëµ½previous1PtrºÍcurrent1PtrÖ¸ÏòµÄ½áµãÖ®¼ä£»*/ findPos(head1Ptr,left2Ptr->data,&previous1Ptr,¤t1Ptr); if(current1Ptr==NULL) { /*ÈôÁ´±í1ÖÐËùÓÐÔªËؾùСÓÚÁ´±í2µÄµ±Ç° ÔªËØ£¬Ôò½«Á´±í2ÕûÌåÁ´½Óµ½Á´±í1µÄβ²¿ */ previous1Ptr->nextPtr=left2Ptr; //Á´±í2Ö±½ÓÁ¬µ½Á´±í1ÉÏ£» head2Ptr=NULL;//ǧÍò²»¿ÉÍüÁËд£¬·ñÔòËÀÑ»· } else {//Èô²»ÊDzåÈëµ½Á´±í1β²¿ /*2。
±È½Ï²¢È·¶¨Á´±í2±¾´Î¿É¹é²¢µÄÁ¬ÐøK¸ö½áµã£»Õâ¶Î½áµãÓÉleft2PtrºÍ previous2PtrÖ¸Ïò */ findPos(head2Ptr,current1Ptr->data,&previous2Ptr,¤t2Ptr); /*3。
½«Á´±í2µÄÓÉleft2PtrºÍprevious2PtrÖ¸ÏòµÄÁ¬Ðø½áµã¹é²¢µ½Á´±í1 */ if(current1Ptr==head1Ptr) { //Èô²åÈëµ½Á´±í1Í·½áµãÇ° previous2Ptr->nextPtr=head1Ptr; head1Ptr=left2Ptr; } else { //Èô²åµ½Á´±íÖмä previous1Ptr->nextPtr=left2Ptr; previous2Ptr->nextPtr=current1Ptr; } head2Ptr=current2Ptr;//ÈôÁ´±í2ÖÐÎÞ½áµãÁË£¬Ôò´Ëʱcurrent2PtrΪ¿Õ } } //END OF WHILE return head1Ptr; }void findPos(LISTNODEPTR headPtr,int value,LISTNODEPTR * previousPtr,LISTNODEPTR * currentPtr){ LISTNODEPTR currentPtrTemp,previousPtrTemp; currentPtrTemp=headPtr; previousPtrTemp=NULL; while (currentPtrTemp!=NULL && currentPtrTemp->datanextPtr; } *previousPtr=previousPtrTemp; *currentPtr=currentPtrTemp;}这是一个综合链表操作,你可以好好研究。
至于那些乱码的文字,。你可以忽略了。收起