c語言鏈表圖
⑴ c語言鏈表問題 如,運行答案是3-4-1-2 最好能附上圖中鏈表圖①②兩個式子的鏈表圖盡量詳細!
while循環外,困缺隱鏈表為
k四次循環後為4
p1->num 如圖為 3
p1=p1->next;
所以輸出為 3 4 1 2
⑵ 求c語言鏈表的詳細講解
鏈表是一種常見的重要的數據結構.它是動態地進行存儲分配的一種結構.我們知道,用數組存放數據時,
必須事先定義固定的長度(即元素個數).比如,有的班級有100人,而有的班只有30人,如果要用同一個數組先後存放不同班級的學生數據,則必須定義長度為100的數組.如果事先難以確定一個班的最多人數,則必須把數組定得足夠大,以能存放任何班級的學生數據.顯然這將會浪費內存.鏈表則沒有這種缺點,它根據需要開辟內存單元.圖10.11表示最簡單的一種鏈表(單向鏈表)的結構.鏈表有一個"頭指針"變數,圖中以head表示,它存放一個地址.
該地址指向一個元素.鏈表中每一個元素稱為"結點",每個結點都應包括兩個部分:一為用戶需要用的實際數據做備大,二為下一個結點的地址.課以看出,head指向第一個元素;第一個元素又指向第二個元素;……,直到最後一個元素,該元素不再指向其它元素,它稱為'表尾",它的地址部分放一個"NULL"(表示"空地址").鏈表到此結束.
可以看到:鏈表中各元素在內存中滾配可以不是連續存放的.要找某一元素,必須先找到上一個元素,根據它提供的下一元素地址才能找到下一個元素.
如果不提供"頭指針"(head),則整個鏈表都無法訪問.鏈表如同一條鐵鏈一樣,一環扣一環,中間是不能斷開的.打個通俗的比方:幼兒園的老師帶領孩子出來散步,老師牽著第一個小孩的手,第一個小孩的另一隻手牽著第二個孩子,……,這就是一純豎個"鏈",最後一個孩子有一隻手空著,他是"鏈尾".要找這個隊伍,必須先找到老師,然後順序找到每一個孩子.
⑶ c語言鏈表,非常感謝
//WIN-TC是什麼turbo? 我在DEV-C下改的,應該也沒問題吧
#include<stdio.h>
#include<malloc.h>
//#define NULL 0 //不用重定義NULL把,空指針用NULL就可以
struct student
{
int num;
char name[20];
float score;
struct student *next;
};
int n=0;
/*建立動態鏈表*/
/* 這個函數猛殲,有重要的問題,你在函數里創建了臨時類,st,head指向它,但是當這個函數結束時,這個類會被銷毀,head將是個沒有指向的指針,所以當在明知旦函數中返回類時,需要堆分配內存
*/
struct student *creat(void)
{
struct student *p1=NULL,*head=NULL; // 這里一個學生類指針即可
struct student *st = (struct student *)malloc(sizeof(struct student)); //同上解釋
printf("Please input records:\n");
scanf("%d%s%f",&(st->num),st->name,&(st->score));
p1=st;
p1->next = NULL;
if(st->num!=0)
head=p1;
while(p1->num!=0)
/*這個鏈表的創立,無非就是那些步驟,你必然明白,再不行,畫個示意圖就明白了,注意的是,什麼時候指針賦值,什麼時候用指針控制變數
*/
{n=n+1;
printf("%dEnd\n",n);
p1->next = (struct student *)malloc(sizeof(struct student));
//這句話至少得有一個「->」,需要控制變數
p1->next->next = NULL;
scanf("%d%s%f",&(p1->next->num),p1->next->name,&(p1->next->score));
if(n!=1)
{
p1 = p1->next;
}
}
printf("\nOver.\n");
/*printf("%o\激擾n",head);
if(head!=NULL)
printf("%10d%10s%10.1f\n",head->num,head->name,head->score);*/
return(head);
}
/*輸出*/
void print(struct student *head)
{
struct student *p;
p=head;
/*printf("%o\n",head);*/
getch();
//if(head==NULL)
//printf("\nList null!\n");
//else
printf("\nNow,there are %d records:\n",n);
while(p!=NULL)
{
printf("%10d%10s%10.1f\n",p->num,p->name,p->score);
p=p->next;
}
}
int main()
{
struct student *head;
head=creat();
/*printf("%o\n",head);
if(head!=NULL)
printf("%10d%10s%10.1f\n",head->num,head->name,head->score);*/
print(head);
getch();
return 0;
}
/*還有些小問題,如應該創建個銷毀鏈表函數,使堆中內存被釋放,等
但不影響達到效果,做個示意夠了
*/
⑷ c語言 鏈表流程圖 怎麼畫呀
你一步步往下分,流程圖不就出來了,比如你的例子:
首先就是p1->number,即p1指向的結點
分不等於0,小於0,等於0 三種情況,
然後再往下分,比如p1->number!=0時
=>n=n+1
判斷n
如果為真怎麼樣,為假又怎麼樣(繼續走)。。。。
就是麻煩點,一步步來流程圖就出來。不過。。。這種東西用流程圖表示,太麻煩了吧。。。
⑸ C語言 如圖 鏈表 這個程序表示什麼作用
這題建立了一段咐陵個頭節點握戚保存值的鏈表,鏈表中每一個節點保存的信息有學號,姓名和成績。
沒有輸出部分,如果要查看鏈表中的數據,需要編寫輸簡氏出。
⑹ C語言如何創建單鏈表
C語言創建單鏈表如下:
#include"stdio.h"
#include"stdlib.h"
#include"malloc.h"
#include "iostream.h"
typedef struct node
{
intdata;
node * next;
}node , * List;
void create(int n)
{
int c;
List s,L;
L=(List)malloc(sizeof(node));
L->next=NULL;
printf("請輸入第1個數據:");
scanf("%d",&c);
L->data=c;
for(int i=2;i<=n;i++)
{
s=(List)malloc(sizeof(node));
printf("請輸入第%d個數據:",i);
scanf("%d",&c);
s->data=c;
s->next=L;
L->next =s;
}
printf("鏈表創建成功!");
}
void main()
{
int n;
printf("請你輸入鏈表的個數:");
scanf("%d",&n);
create(n);
}
⑺ 用c語言建立一個有序鏈表
先按正常流程建立一個鏈表,再按照其某一個成員值進行冒泡排序(排序過程的交換,只交換鏈表指針以外的成員值)。
演示代碼如下:(演示代碼鏈表20個節點,成員值為隨機值)
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
typedef struct slist
{
int a;
struct slist *next;
}SLIST;
SLIST *init();//生成20個節點成員為隨機數的鏈表
void showList(SLIST *slHead);//列印鏈表
void px(SLIST *slHead,int flag);//float=1:降序。=2升序
int main()
{
SLIST *slHead=NULL;
slHead=init();
printf("排序前: ");
showList(slHead);
printf(" 降序排序後: ");
px(slHead,1);
showList(slHead);
printf(" 升序排序後: ");
px(slHead,2);
showList(slHead);
return 0;
}
void px(SLIST *slHead,int flag)//flag=1:降序。=2升序
{
SLIST *sl0=slHead->next,*sl1=NULL,slSave,*pSave=NULL;
while(sl0)
{
sl1=sl0->next;
while(sl1)
{
if((flag==1 && sl0->a<sl1->a)||(flag==2 && sl0->a>sl1->a))
{
slSave=*sl0;
*sl0=*sl1;
sl0->next=slSave.next;
pSave=sl1->next;
*sl1=slSave;
sl1->next=pSave;
}
sl1=sl1->next;
}
sl0=sl0->next;
}
}
void showList(SLIST *slHead)
{
int i=0;
while(slHead->next)
{
printf("節點%d成員值:%d ",++i,slHead->next->a);
slHead=slHead->next;
}
printf(" ");
}
SLIST *init()
{
int num,cnt=20;
static SLIST head;
SLIST *slHead=&head,*slTail=NULL,*slNew=NULL;
slHead->next=NULL;
srand(time(NULL));
while(cnt--)
{
num=rand()%100;
slNew=(SLIST *)malloc(sizeof(SLIST));
if(!slNew)return NULL;
slNew->a=num;
slNew->next=NULL;
if(!slHead->next)
slHead->next=slNew;
else
slTail->next=slNew;
slTail=slNew;
}
return slHead;
}
⑻ c語言鏈表,不太懂,畫圖解釋一下這道題
structnode*ave(structnode*h,int*count){
structnode*p1;//不需要p2
floatsume=0,sum=0;
*count=0;
if(h==塌鎮埋NULL)returnNULL;
p1=h;
while(p1!=NULL){//(19):直接填p1也有同樣的效果
sume+=p1->English;
sum+=p1->math;
p1=p1->next;//(20):向前移動指針
}//原代碼中缺少這個右括弧,真是害人不淺
//接下來將新建的結點添加到原鏈表的頭部,並返團螞回該旅謹結點地址
}
⑼ C語言用鏈表進行數據錄入,圖片第三張是我的問題,希望大神能給我畫個示意圖。
head指向頭結點,返回head時返回head指向的鏈表;
head在開辟空間是就已經指向了頭結點,後面使用的是p1,p2之類的指針指向head(也就是指向頭結點),對鬧乎p1,p2操作也就是對head指向的節點所在的鏈表進行操明坦作,返回時返液槐悉回head,沒毛病