單鏈表—頭插法和尾插法
阿新 • • 發佈:2020-11-01
尾插法(帶頭結點)
/*********************************************/ /*********** 帶頭結點的方法 **********/ /*******************************************/ #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; //資料域 struct Node * pNext;//指標域 }NODE, * PNODE; //由於使用了typedef, 所以NODE <=> struct Node , PNODE <=> struct Node * PNODE create_list(); //建立一個連結串列 void traverse_list(PNODE pHead); //遍歷整個連結串列並輸出
int main()
{
PNODE pHead = NULL; //頭指標為空,用來儲存頭結點的地址
int val; //用來儲存刪除的元素
int location; //儲存查詢元素的位置
pHead = create_list(); //建立一個連結串列,並返回頭結點的地址給pHead
traverse_list(pHead); //遍歷整個連結串列
return 0;
}
PNODE create_list() { int len; //用來存放有效節點的個數 int i; int temp_val; //臨時存放使用者輸入結點資料域的值 //分配一個不存放有效資料的頭結點 PNODE pHead = (PNODE)malloc(sizeof(NODE)); if(NULL == pHead) {printf("分配失敗,程式終止!"); exit(-1);} PNODE pTemp = pHead; //臨時存放頭結點的地址,頭結點的位置不能變 pTemp->pNext = NULL; printf("請輸入您要生成的連結串列節點的個數: len = "); scanf("%d", &len); for(i = 0; i<len; i++) { printf("請輸入第%d個節點資料域的值 :", i+1); //正序輸入 scanf("%d", &temp_val); //迴圈一次分配一個存放有效資料的結點 PNODE pNew = (PNODE)malloc(sizeof(NODE)); if(NULL ==pNew) {printf("分配失敗,程式終止!"); exit(-1);} pNew->data = temp_val; //尾插法 pTemp->pNext = pNew; pNew->pNext = NULL; //每分配一個結點,這個結點就是最後一個,所以它的指標域(pNext)為空 pTemp = pNew; //保證前一個結點的指標域都指向後一個結點 } return pHead; //返回頭結點的地址 } /*———————————————————————————————————————————————————————*/ void traverse_list(PNODE pHead) { PNODE p = pHead->pNext; //頭結點的指標域賦給p,即頭結點賦給p 【注意區分頭結點和首結點】 printf("連結串列的資料為:\n"); while(NULL != p) { printf("%d ", p->data); p = p->pNext; //下一個結點賦給p } printf("\n"); }
頭插法(不帶頭結點)
/***********************************************/ /*********** 不帶頭結點的方法 **********/ /*********************************************/ #include <stdio.h> #include <stdlib.h> typedef struct Node { int data; //資料域 struct Node * pNext;//指標域 }NODE, * PNODE; //由於使用了typedef, 所以NODE <=> struct Node , PNODE <=> struct Node * PNODE create_list(); //建立一個連結串列 void traverse_list(PNODE pFirst); //遍歷整個連結串列並輸出
int main()
{
PNODE pFirst = NULL; //首指標為空,用來儲存首結點的地址
int val; //用來儲存刪除的元素
int location; //儲存查詢元素的位置
pFirst = create_list(); //建立一個連結串列,並返回頭結點的地址給pHead
traverse_list(pFirst); //遍歷整個連結串列
return 0;
}
/*———————————————————————————————————————————————————————*/
PNODE create_list()
{
int len; //用來存放有效節點的個數
int i;
int temp_val; //臨時存放使用者輸入結點資料域的值
PNODE pFirst = NULL; //首結點必須先賦值為空,因為它將作為尾結點的指標域
printf("請輸入您要生成的連結串列節點的個數: len = ");
scanf("%d", &len);
for(i = 0; i<len; i++)
{
printf("請輸入第%d個節點資料域的值 :", len-i); //逆序輸入值
scanf("%d", &temp_val);
//迴圈一次分配一個存放有效資料的結點
PNODE pNew = (PNODE)malloc(sizeof(NODE));
if(NULL ==pNew) {printf("分配失敗,程式終止!"); exit(-1);}
pNew->data = temp_val;
//頭插法
pNew->pNext = pFirst;
pFirst = pNew;
}
return pFirst; //返回首結點的地址
}
/*———————————————————————————————————————————————————————*/
void traverse_list(PNODE pFirst)
{
PNODE p = pFirst; //首結點的指標域賦給p,即首結點賦給p 【注意區分頭結點和首結點】
printf("連結串列的資料為:\n");
while(NULL != p)
{
printf("%d ", p->data);
p = p->pNext; //下一個結點賦給p
}
printf("\n");
}