題目要求:(2)完成單鏈表上的如下操作:
① 逆序建立單鏈表
② 遍歷單鏈表(輸出單鏈表每個元素的值)
③ 在單鏈表第5個元素前插入一個值為999的元素.
④ 洗掉單鏈表第5個元素.
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode //定義單鏈表存盤結構
{
int data;
struct Lnode *next;
}Lnode, *linklist;
void CreatList_L(linklist L,int n);
void ListTraverse(linklist L,int n);
void ListInsert(linklist L,int i,int e,int n); //n為鏈表中結點個數 ,i為第i個元素前插入,e是新結點的值
void ListDelete(linklist L,int i,int *node,int n); //n為鏈表中結點個數 ,i為洗掉結點的位置,e用來回傳洗掉結點的值
void visit();
int main()
{
linklist L;
int n,i=5,e=999,*node;
printf("請輸入你想建立單鏈表的結點個數:\n");
scanf("%d",&n);
CreatList_L(L,n); //逆序建立單鏈表,并將單鏈表的頭地址賦給指標s
ListTraverse(L,n); //遍歷單鏈表
ListInsert(L,i,e,n); //插入
ListDelete(L,i,node,n); //洗掉
}
void CreatList_L(linklist L,int n) //逆序建立
{
printf("-----逆序建立------\n");
linklist p;
int i;
L=(Lnode*)malloc(sizeof(Lnode)); //建立帶頭結點的單鏈表
L->next==NULL;
for(i=n;i>0;i--)
{
p=(Lnode*)malloc(sizeof(Lnode));
printf("please enter a number:\n");
scanf("%d",&p->data);
p->next=L->next;
L->next=p;
}
}
void ListTraverse(linklist L,int n) //遍歷單鏈表
{
printf("\n\n-------遍歷--------\n");
int i;
linklist p;
p=L->next;
for(i=0;i<n;i++)
{
visit(p);
p=p->next;
}
}
void visit(linklist p) //輸出
{
printf("%d ",p->data);
}
void ListInsert(linklist L,int i,int e,int n) //第5個元素前插入元素
{
printf("\n\n-----插入元素------\n");
linklist p,q;
p=L;
//e=999;
//i=5;
int j=0;
while((p->next)&&j<i-1) //尋找第i-1個結點位置
{
p=p->next;
j++;
}
if(p->next==NULL) //插入位置不合理
{
printf("ERROR!插入位置不合理!");
exit(0);
}
q=(Lnode*)malloc(sizeof(Lnode)); //建立新結點
q->data=https://bbs.csdn.net/topics/e;
q->next=p->next; //連入鏈表
p->next=q;
printf("\n插入成功!\n");
printf("\n新鏈表為:");
p=L;
for(i=0;i<n+1;i++)
{
p=p->next;
visit(p);
}
}
void ListDelete(linklist L,int i,int *node,int n) //洗掉第i個元素
{
printf("\n\n-----洗掉元素------\n");
linklist p,q;
p=L;
//i=5;
int j=0;
while(p->next&&j<i-1) //尋找洗掉結點的上個結點地址
{
p=p->next;
j++;
}
if(p->next==NULL) //洗掉位置不合理
{
printf("ERROR!洗掉位置不合理!");
exit(0);
}
q=p->next; //洗掉結點
p->next=q->next;
*node=q->data;
free(q); //釋放結點
printf("\n洗掉成功!\n");
printf("\n新鏈表為:");
p=L;
for(i=0;i<n-1;i++)
{
p=p->next;
visit(p);
}
}

這個是截圖,到遍歷函式開始就不運行了,不知道哪里有錯誤?是邏輯上嗎?
還是語法上?(好幾個程式都是運行一半不動了。。。)希望說詳細一點!非常感謝!!!!
uj5u.com熱心網友回復:
可在VS里面下斷點,單步除錯。uj5u.com熱心網友回復:
#include <stdio.h>
#include <stdlib.h>
typedef struct Lnode //定義單鏈表存盤結構
{
int data;
struct Lnode *next;
}Lnode, *linklist;
void CreatList_L(linklist *L,int n);
void ListTraverse(linklist L,int n);
void ListInsert(linklist L,int i,int e,int n); //n為鏈表中結點個數 ,i為第i個元素前插入,e是新結點的值
void ListDelete(linklist L,int i,int *node,int n); //n為鏈表中結點個數 ,i為洗掉結點的位置,e用來回傳洗掉結點的值
void visit(linklist p);
int main()
{
linklist L;
int n,i=5,e=999,*node;
printf("請輸入你想建立單鏈表的結點個數:\n");
scanf("%d",&n);
CreatList_L(&L,n); //逆序建立單鏈表,并將單鏈表的頭地址賦給指標s
ListTraverse(L,n); //遍歷單鏈表
ListInsert(L,i,e,n); //插入
ListDelete(L,i,node,n); //洗掉
}
void CreatList_L(linklist *L,int n) //逆序建立
{
printf("-----逆序建立------\n");
linklist p;
int i;
*L=(Lnode*)malloc(sizeof(Lnode)); //建立帶頭結點的單鏈表
//L->next==NULL;
(*L)->next = NULL;
for(i=n;i>0;i--)
{
p=(Lnode*)malloc(sizeof(Lnode));
printf("please enter a number:\n");
scanf("%d",&p->data);
p->next=(*L)->next;
(*L)->next=p;
}
}
void ListTraverse(linklist L,int n) //遍歷單鏈表
{
printf("\n\n-------遍歷--------\n");
int i;
linklist p;
p=L->next;
for(i=0;i<n;i++)
{
visit(p);
p=p->next;
}
}
void visit(linklist p) //輸出
{
printf("%d ",p->data);
}
void ListInsert(linklist L,int i,int e,int n) //第5個元素前插入元素
{
printf("\n\n-----插入元素------\n");
linklist p,q;
p=L;
//e=999;
//i=5;
int j=0;
while((p->next)&&j<i-1) //尋找第i-1個結點位置
{
p=p->next;
j++;
}
if(p->next==NULL) //插入位置不合理
{
printf("ERROR!插入位置不合理!");
exit(0);
}
q=(Lnode*)malloc(sizeof(Lnode)); //建立新結點
q->data=https://bbs.csdn.net/topics/e;
q->next=p->next; //連入鏈表
p->next=q;
printf("\n插入成功!\n");
printf("\n新鏈表為:");
p=L;
for(i=0;i<n+1;i++)
{
p=p->next;
visit(p);
}
}
void ListDelete(linklist L,int i,int *node,int n) //洗掉第i個元素
{
printf("\n\n-----洗掉元素------\n");
linklist p,q;
p=L;
//i=5;
int j=0;
while(p->next&&j<i-1) //尋找洗掉結點的上個結點地址
{
p=p->next;
j++;
}
if(p->next==NULL) //洗掉位置不合理
{
printf("ERROR!洗掉位置不合理!");
exit(0);
}
q=p->next; //洗掉結點
p->next=q->next;
*node=q->data;
free(q); //釋放結點
printf("\n洗掉成功!\n");
printf("\n新鏈表為:");
p=L;
for(i=0;i<n-1;i++)
{
p=p->next;
visit(p);
}
}
供參考~
uj5u.com熱心網友回復:
為什么創建單鏈表時一定要用二級指標呢??這點一直不太明白,一級指標傳入的不也是地址嗎??
希望可以講解一下!非常感謝!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/238242.html
標籤:C語言
上一篇:新手求助:Beginning C習題 codeblocks運行不起來?
下一篇:C語言
