結果是這樣的

這是我的代碼
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
//單鏈表的存盤結構
typedef struct LNode
{
ElemType data;
struct LNode *next; //next指向自身型別struct LNode *的指標
}LNode,*LinkList; //LinkList為指向結構體LNode的指標型別
int ListEmpty(LinkList L)
{
printf("\n正在檢查.......\n");
if(L->next) return FALSE; //非空 0
return TRUE; //空 1
}
/*頭插法(前插法)
*/
void CreateList_H(LinkList L,int n) //形參LinkList型別的指標變數(用于指向新開辟儲存單元),逆序儲存n個元素值
{
L = (LinkList)malloc(sizeof(LNode)); //為頭結點開辟儲存空間
L->next = NULL; //含頭結點的空鏈表
int i; //元素數量計數
for(i=0;i<n;i++) //回圈輸入元素
{
ElemType e;
LNode *p=(LinkList)malloc(sizeof(LNode)); //為新結點開辟空間并令指標指向該地址
printf("請輸入1個鏈表元素:");
scanf("%d",&e); //向新結點資料域輸入資料
p->data = e;
printf("保存完成~\n");
p->next = L->next; //頭結點指標域的值(即新結點后繼結點地址)賦給新結點指標域進行連接
L->next = p; //指標域指標連接順序不可顛倒 新結點地址賦值給頭結點指標域進行連接
}
}
//鏈表遍歷
void print(LinkList L)
{
LNode *p;
p=L->next;
if(p == NULL) printf("鏈表為空~");
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
int main()
{
int status;
LinkList L;
CreateList_H(L,2);
print(L);
status = ListEmpty(L);
printf("%d\n",status);
return 0;
}
謝謝
uj5u.com熱心網友回復:
樓主的C語言指標有待加強,建議看看譚浩強的C語言。修改如下,僅供參考:
#include <stdio.h>
#include <stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef int ElemType;
//單鏈表的存盤結構
typedef struct LNode
{
ElemType data;
struct LNode *next; //next指向自身型別struct LNode *的指標
}LNode,*LinkList; //LinkList為指向結構體LNode的指標型別
int ListEmpty(LinkList L)
{
printf("\n正在檢查.......\n");
if(L->next) return FALSE; //非空 0
return TRUE; //空 1
}
/*頭插法(前插法)
*/
void CreateList_H(LinkList *L,int n) //形參LinkList型別的指標變數(用于指向新開辟儲存單元),逆序儲存n個元素值
{
*L = (LinkList)malloc(sizeof(LNode)); //為頭結點開辟儲存空間
(*L)->next = NULL; //含頭結點的空鏈表
int i; //元素數量計數
for(i=0;i<n;i++) //回圈輸入元素
{
ElemType e;
LNode *p=(LinkList)malloc(sizeof(LNode)); //為新結點開辟空間并令指標指向該地址
printf("請輸入1個鏈表元素:");
scanf("%d",&e); //向新結點資料域輸入資料
p->data = e;
printf("保存完成~\n");
p->next = (*L)->next; //頭結點指標域的值(即新結點后繼結點地址)賦給新結點指標域進行連接
(*L)->next = p; //指標域指標連接順序不可顛倒 新結點地址賦值給頭結點指標域進行連接
}
}
//鏈表遍歷
void print(LinkList L)
{
LNode *p;
p=L->next;
if(p == NULL) printf("鏈表為空~");
while(p != NULL)
{
printf("%d ",p->data);
p = p->next;
}
}
int main()
{
int status;
LinkList L;
CreateList_H(&L,2);
print(L);
status = ListEmpty(L);
printf("%d\n",status);
return 0;
}
uj5u.com熱心網友回復:
能講講你的思路嗎 我按照你的思路給你改uj5u.com熱心網友回復:
CreateList_H(L,2); 這里出了問題 這里傳遞的是形參 用指標就行了 CreateList_H(&L,2);uj5u.com熱心網友回復:
抱歉 我沒有仔細看 你錯的太多了uj5u.com熱心網友回復:
/*頭插法(前插法)
*/
void CreateList_H(LinkList * PL, int n) //形參LinkList型別的指標變數(用于指向新開辟儲存單元),逆序儲存n個元素值
{
LinkList L = *PL;
L = (LinkList)malloc(sizeof(LNode)); //為頭結點開辟儲存空間
*PL = L;
L->next = NULL; //含頭結點的空鏈表
int i; //元素數量計數
for (i = 0; i < n; i++) //回圈輸入元素
{
ElemType e;
LNode *p = (LinkList)malloc(sizeof(LNode)); //為新結點開辟空間并令指標指向該地址
printf("請輸入1個鏈表元素:");
scanf("%d", &e); //向新結點資料域輸入資料
p->data = e;
printf("保存完成~\n");
p->next = L->next; //頭結點指標域的值(即新結點后繼結點地址)賦給新結點指標域進行連接
L->next = p; //指標域指標連接順序不可顛倒 新結點地址賦值給頭結點指標域進行連接
}
}
uj5u.com熱心網友回復:
如果在子函式里分配記憶體,則要傳遞二級指標進去。uj5u.com熱心網友回復:
有點糾結或是不理解吧,為什么要傳遞進去的是二級指標
uj5u.com熱心網友回復:
CreateList_H(LinkList *L,int n),這,可以講講為什么傳遞進去的二重指標嗎
uj5u.com熱心網友回復:
想了半天沒弄明白它這里傳遞指標的邏輯程序是什么,能講講嘛?謝謝
uj5u.com熱心網友回復:
看看我1樓的回復。。這是標準C語言指標的用法,看看老譚的C吧。
C語言函式是值傳遞,要回傳結果,必須把地址傳進去。本來是一級指標,即成了二級指標。。
uj5u.com熱心網友回復:
單鏈表頭插法演算法完全正確。就是C語言指標問題。C語言指標的基本用法,看看書才行,別人不好解釋。
uj5u.com熱心網友回復:
/*頭插法(前插法)
*/
void CreateList_H(LinkList * PL, int n) //形參LinkList型別的指標變數(用于指向新開辟儲存單元),逆序儲存n個元素值
{
LinkList L = *PL;
L = (LinkList)malloc(sizeof(LNode)); //為頭結點開辟儲存空間
*PL = L;
L->next = NULL; //含頭結點的空鏈表
int i; //元素數量計數
for (i = 0; i < n; i++) //回圈輸入元素
{
ElemType e;
LNode *p = (LinkList)malloc(sizeof(LNode)); //為新結點開辟空間并令指標指向該地址
printf("請輸入1個鏈表元素:");
scanf("%d", &e); //向新結點資料域輸入資料
p->data = e;
printf("保存完成~\n");
p->next = L->next; //頭結點指標域的值(即新結點后繼結點地址)賦給新結點指標域進行連接
L->next = p; //指標域指標連接順序不可顛倒 新結點地址賦值給頭結點指標域進行連接
}
}
CreateList_H(LinkList *L,int n),這,可以講講為什么傳遞進去的二重指標嗎
就這個代碼片段而言 當你傳遞的一重指標的話 因為是值傳遞 所以 形參L 和你 原來的L是值一致。也就是他們所指向的記憶體塊是一致的。
比如 呼叫L 地址是 0x12 值是 0x20(也就是指向了0x20這個起始地址)。然后形參L 地址 是0x14 值也是(0x20).然后當再函式內部malloc 時 相當于是把形參L 的值改成了 0x30 也就是 此時形參L 地址0x14 值0x30(也就是指向了0x30這個起始地址) .此時你對形參L的操作本質都是再操作 0x30 這塊記憶體。但是由于你原來呼叫的L值依然是0x20。所以結果是錯誤的。
uj5u.com熱心網友回復:
/*頭插法(前插法)
*/
void CreateList_H(LinkList * PL, int n) //形參LinkList型別的指標變數(用于指向新開辟儲存單元),逆序儲存n個元素值
{
LinkList L = *PL;
L = (LinkList)malloc(sizeof(LNode)); //為頭結點開辟儲存空間
*PL = L;
L->next = NULL; //含頭結點的空鏈表
int i; //元素數量計數
for (i = 0; i < n; i++) //回圈輸入元素
{
ElemType e;
LNode *p = (LinkList)malloc(sizeof(LNode)); //為新結點開辟空間并令指標指向該地址
printf("請輸入1個鏈表元素:");
scanf("%d", &e); //向新結點資料域輸入資料
p->data = e;
printf("保存完成~\n");
p->next = L->next; //頭結點指標域的值(即新結點后繼結點地址)賦給新結點指標域進行連接
L->next = p; //指標域指標連接順序不可顛倒 新結點地址賦值給頭結點指標域進行連接
}
}
CreateList_H(LinkList *L,int n),這,可以講講為什么傳遞進去的二重指標嗎
就這個代碼片段而言 當你傳遞的一重指標的話 因為是值傳遞 所以 形參L 和你 原來的L是值一致。也就是他們所指向的記憶體塊是一致的。
比如 呼叫L 地址是 0x12 值是 0x20(也就是指向了0x20這個起始地址)。然后形參L 地址 是0x14 值也是(0x20).然后當再函式內部malloc 時 相當于是把形參L 的值改成了 0x30 也就是 此時形參L 地址0x14 值0x30(也就是指向了0x30這個起始地址) .此時你對形參L的操作本質都是再操作 0x30 這塊記憶體。但是由于你原來呼叫的L值依然是0x20。所以結果是錯誤的。
太感謝了
通過自己的理解,把大致的程序寫了一遍,是這樣嘛?
uj5u.com熱心網友回復:
C語言的指標,如同匯編語言中的間接尋址。好好看書吧,要不然C語言老師都可能哭暈在廁所。
本來很簡單的問題,被折騰這樣,估計把自己都折騰糊涂了。
uj5u.com熱心網友回復:
C語言的指標,如同匯編語言中的間接尋址。
好好看書吧,要不然C語言老師都可能哭暈在廁所。
本來很簡單的問題,被折騰這樣,估計把自己都折騰糊涂了。
嗚嗚嗚~ 自學呢~
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/257228.html
標籤:C語言
上一篇:新手求助!程式為何不對?
