/*單鏈表的練習-頭插法*/ /*單鏈表由頭結點就能夠惟一肯定*/ #include <malloc.h> #include <stdio.h> #include <stdlib.h> //定義單鏈表結構 typedef struct Node{ int data; //數據域 Node * pNext; //指針域 }NODE,* PNODE; PNODE create_list(void); //建立鏈表 void show_list(PNODE pHead); //顯示鏈表 void insert(PNODE pHead,int pos,int inval); //向鏈表中某個位置插入元素 int deleteList(PNODE pHead,int pos); //刪除鏈表某個位置上的值 void find(PNODE pHead,int fval); //在鏈表中查找某個元素 void main(){ PNODE pHead = NULL; //定義一個頭結點,初始值爲空 pHead = create_list(); show_list(pHead); insert(pHead,2,100); show_list(pHead); find(pHead,3); printf("你所刪除的值是%d\n",deleteList(pHead,2)); show_list(pHead); } PNODE create_list(void){ int length,val; PNODE pHead = (PNODE)malloc(sizeof(NODE)); //向內存申請頭節點空間 pHead->pNext=NULL; //開始的時候只有頭結點自身,沒有其它結點 if(NULL == pHead){ printf("分配失敗,程序終止"); exit(-1); } printf("請輸入須要生成的單鏈表的長度:"); scanf("%d",&length); for(int i=0;i<length;i++){ //for循環生成指定個數的結點 printf("請輸入第%d個節點的值: ",i+1); scanf("%d",&val); PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL == pNew){ printf("分配失敗,程序終止"); exit(-1); } pNew->data=val; //給新申請的結點數據域賦值 pNew->pNext=pHead->pNext; //頭指針指向的下一個結點的地址賦給了新結點的指針域,也就是在當前頭結點後面直接插入一個新結點 pHead->pNext=pNew; //頭結點指向了新的結點 } return pHead; //函數返回頭結點的地址 } void show_list(PNODE pHead){ printf("單鏈表的值以下:\n"); PNODE P = pHead->pNext; while(P != NULL){ //while巡檢打印出因此結點,直到下個結點不存在 printf("%d ",P->data); P=P->pNext; } printf("\n"); } void insert(PNODE pHead,int pos,int inval){ PNODE P = pHead; int j=0; while(P != NULL && j<pos-1){ //若是結點不爲空,把P指針移動到插入位置的前一個結點位置 P = P->pNext; j++; } if(P == NULL){ printf("插入失敗\n"); exit(-1); }else{ PNODE pNew = (PNODE)malloc(sizeof(NODE)); //申請新的結點 pNew->data=inval; //將要插入的值賦值給新結點的數據域 pNew->pNext=P->pNext; //新結點指向P指針指向的下一個結點 P->pNext=pNew; //P指針所在的結點指向新結點 printf("你已經成功的插入了元素%d到鏈表中.\n",inval); } } int deleteList(PNODE pHead,int pos){ PNODE P = pHead,S; int j=0,x; if(P != NULL && j<pos-1){ P = P->pNext; j++; } if(P == NULL){ printf("刪除失敗,數組是空的"); exit(-1); }else{ S = P->pNext; P->pNext = S->pNext; x = S->data; free(S); return x; } } void find(PNODE pHead,int fval){ PNODE P = pHead; int cnt=0; if(P == NULL){ printf("不用找了,鏈表是空的\n"); exit(-1); } while(P != NULL){ P = P->pNext; ++cnt; if(P->data==fval){ printf("你要找的數%d在鏈表中,它在鏈表的第%d個位置\n",fval,cnt); break; } } }
結果截圖數組