❶ c語言鏈表
指針在x86系統里大小是32位4個位元組,在64位系統是8位元組大小。指針好比一個盒子,盒子里有個東西也就是它指向的內容,內容是一個實體對象的首地址。盒子本身不能存放實體對象,就好比盒子里有張名片,通過名片你可以找到這個人,總不能把人放盒子里吧。
得有這個人然後把找到這個人的名片放盒子里。
❷ C語言鏈表···
struct date{…}/鏈表結構體
p1/定義鏈表結構體的一個指針名插入點/
p1=(struct date *)malloc(sizeof(struct date))/分配鏈表內存
free(newnode)/釋放節點內存
刪除全部節點定義兩個鏈表指針名p1,p2循環刪除
while(p1->next!=NULL)
{p2=p1;
p1->…/p1指向下鏈表一節點
free(p2);
}
❸ c語言鏈表
#include<stdio.h>
#include<stdlib.h>
struct chain
{
int value;
struct chain *next;
};
struct chain *create()
{
struct chain *head,*tail,*p;
int x;
head = tail = NULL;
while(scanf("%d",&x)==1)
{
p=(struct chain*)malloc(sizeof(struct chain));
p->value=x;
p->next=NULL;
if(head==NULL)
head = tail = p;
else
tail=tail->next=p;
}
return head;
}
struct chain *inlink(struct chain *head,int a,int b) //int a代表要插入的節點,int b代表創建節點的數據域
{
struct chain *p,*q,*s;
s = (struct chain *)malloc(sizeof(struct chain));
s->value=b;
if(head==NULL)
{
head = s;
head->next = NULL;
}
if(head->value == a)
{
s->next=head;
head = s;
}
else
{
p=head;
while((p->value!=a)&&(p->next!=NULL))
{
q=p;
p=p->next;
}
if(p->value == a)
{
q->next = s;
s->next = p;
}
else
{
p->next=s;
s->next=NULL;
}
}
return (head);
}
struct chain *dellink(struct chain *head,int a) //int a代表要刪除的節點
{
struct chain *q,*p;
if(head == NULL)
printf("找不到節點!\n");
else if(head->value == a)
{
p = head;
head = head->next;
}
else
{
p=head;
while((p->value!=a)&&(p->next!=NULL))
{
q=p;
p=p->next;
}
if(p->value != a)
printf("鏈表不存在此節點!\n");
else
{
q->next = p->next;
free(p);
}
}
return (head);
}
void main()
{
struct chain *p,*q;
q=create(); //鏈表的創建;
//q=inlink(create(),3,1); //鏈表的插入;
//q=dellink(create(),2); //鏈表的刪除;
while(q){ //輸出鏈表;
printf("%d\n",q->value);
p=q->next;
free(q);
q=p;
}
}
希望能解決您的問題。
❹ c語言 鏈表
#include <stdio.h>
#include <stdlib.h>
//這里創建一個結構體用來表示鏈表的結點類型
struct node
{
int data;
struct node *next;
};
int main()
{
struct node *head,*p,*q,*t;
int i,n,a,b;
printf("輸入小朋友人數和待插入的小朋友身高:如6,97
");
scanf("%d,%d",&n,&b);
printf("輸入已經排好隊的小朋友的身高序列:
");
head = NULL;// 頭指針初始為空
for(i=1;i<=n;i++)// 循環讀入n個數
{
scanf("%d",&a);
// 動態申請一個空間,用來存放一個結點,並用臨時指針p指向這個結點
p=(struct node *)malloc(sizeof(struct node));
p->data=a;// 將數據存儲到當前結點的data域中
p->next=NULL;// 設置當前結點的後繼指針指向空,也就是當前結點的下一個結點為空
if(head==NULL)
head=p;// 如果這是第一個創建的結點,則將頭指針指向這個結點
else
q->next=p;// 如果不是第一個創建的結點,則將上一個結點的後繼指針指向當前結點
q=p;// 指針q也指向當前結點
}
t=head;// 從鏈表頭部開始遍歷
while(t!=NULL)// 當沒有到達鏈表尾部的時候循環
{
if(t->next->data > b)// 如果當前結點下一個結點的值大於待插入數,將數插入到中間
{
p=(struct node *)malloc(sizeof(struct node));// 動態申請一個空間,用來存放新增結點
p->data=b;
p->next=t->next;//新增結點的後繼指針指向當前結點的後繼指針所指向的結點
t->next=p;// 當前結點的後繼指針指向新增結點
break;// 插入完畢退出循環
}
t=t->next;// 繼續下一個結點
}
// 輸出鏈表中的所有數
t=head;
printf("插入後序列為:
");
while(t!=NULL)
{
printf("%d ",t->data);
t=t->next;// 繼續下一個結點
}
system("pause");
return 0;
}
請採納
❺ C語言 鏈表
#include<stdio.h>
#include<stdlib.h>
struct chain
{
int value;
struct chain *next;
};
struct chain *create()
{
struct chain *head,*tail,*p;
int x;
head = tail = NULL;
while(scanf("%d",&x)==1)
{
p=(struct chain*)malloc(sizeof(struct chain));
p->value=x;
p->next=NULL;
if(head==NULL)
head = tail = p;
else
tail=tail->next=p;
}
return head;
}
struct chain *inlink(struct chain *head,int a,int b) //int a代表要插入的節點,int b代表創建節點的數據域
{
struct chain *p,*q,*s;
s = (struct chain *)malloc(sizeof(struct chain));
s->value=b;
if(head==NULL)
{
head = s;
head->next = NULL;
}
if(head->value == a)
{
s->next=head;
head = s;
}
else
{
p=head;
while((p->value!=a)&&(p->next!=NULL))
{
q=p;
p=p->next;
}
if(p->value == a)
{
q->next = s;
s->next = p;
}
else
{
p->next=s;
s->next=NULL;
}
}
return (head);
}
struct chain *dellink(struct chain *head,int a) //int a代表要刪除的節點
{
struct chain *q,*p;
if(head == NULL)
printf("找不到節點!\n");
else if(head->value == a)
{
p = head;
head = head->next;
}
else
{
p=head;
while((p->value!=a)&&(p->next!=NULL))
{
q=p;
p=p->next;
}
if(p->value != a)
printf("鏈表不存在此節點!\n");
else
{
q->next = p->next;
free(p);
}
}
return (head);
}
void main()
{
struct chain *p,*q;
q=create(); //鏈表的創建;
//q=inlink(create(),3,1); //鏈表的插入;
//q=dellink(create(),2); //鏈表的刪除;
while(q){ //輸出鏈表;
printf("%d\n",q->value);
p=q->next;
free(q);
q=p;
}
}
滿意請採納。
❻ 關於c語言鏈表
因為你只創建了一個啊,你的本意是用create函數執行創建鏈表的工作,不管多少個都是由它完成的,但是你的create函數明明沒有while循環或者dowhile循環啊,只做了一遍啊,第一遍的if做完了,第一個鏈表完成了,再次scanf了之後,就退出來了啊,在你創建了一個鏈表之後,就在那個鏈表的尾部寫入NULL了,程序就結束了啊,又沒一直做scanf,和創建鏈表的工作。create沒循環啊,列印鏈表是沒錯啊,輸出了第一個啊,你自己創建的第一個叫head,只有後面的鏈接,自己本身沒有存放任何數,只輸出了第二個鏈表,第二鏈表的next就是NULL了,輸出當然就停止了啊。
怕我沒說清楚,或者把你繞暈了,所以我截個圖給你看。
你這個if只做了一遍啊,沒有循環啊,然後就再次用scanf了,然後呢?然後就退出if了吧,然後就執行了r->next=NULL;對吧,r不就是你創建的第一個有數據的鏈表嗎?然後就return h了,那麼只有一個啊,有循環嗎?scanf了之後,也沒判斷數值啊,不是-1,應該繼續做啊。
解決方案:在這個if的外面,加一個do while的循環,然後判斷scanf讀入的n的值,應該就可以了。
❼ 數據結構c語言版鏈表問題
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct data {
char num[9]; //停不下來有可能是串定義的小了,輸入的數據大了,導致內存混亂!8個數據的串要定義9個空間,給'\0'留個位置
char name[9];
char gender[9];
int score ;
} ;
typedef struct aa
{
struct data date;
struct aa *next ;
} sequenlist ;
void createList(sequenlist *L)// 優化了一下這個函數
{
int n,i;
sequenlist *p1;
sequenlist *p2;
p1=L; //p1指向表頭,所以的數據均在此表頭後插入
printf("有幾位學生?請輸入:\n");
scanf("%d",&n);
printf("以下請輸入這%d位學生的信息:\n",n);
for(i=1;i<=n;++i)
{
printf("第%d位學生:",i);
printf("\n學號(8) 姓名(8) 性別 成績\n");
fflush(stdin);
p2=(sequenlist *)malloc(sizeof(sequenlist));//p2是新結點,直接將數據讀入
scanf("%s%s%s%d",p2->date.num,p2->date.name,p2->date.gender,&p2->date.score);
p1->next=p2; //將新結點加到表尾
p1=p2;//新結點成為新的表尾
}
p1->next=NULL; //置表結束
}
void printList(sequenlist *L)
{
int i;
i=0;
printf("\n學號(8) 姓名(8) 性別 成績\n");
printf("-------------------------------------------\n");
L=L->next;
while(L!=NULL)
{
i++;
printf("第%d位學生:",i);
printf("%s,%s,%s,%d\n",L->date.num,L->date.name,L->date.gender,L->date.score);
printf("------------------------------------------------------------------\n");
L=L->next;
}
}
int main()
{
sequenlist *head=(sequenlist *)malloc(sizeof(sequenlist) ); //這個很重要,建立一個非數據的頭結點
createList(head);
printList(head);
return 0;
}
有幾位學生?請輸入:
2
以下請輸入這2位學生的信息:
第1位學生:
學號(8) 姓名(8) 性別 成績
1 hello male 100
第2位學生:
學號(8) 姓名(8) 性別 成績
2 world female 95
學號(8) 姓名(8) 性別 成績
-------------------------------------------
第1位學生:1,hello,male,100
------------------------------------------------------------------
第2位學生:2,world,female,95
------------------------------------------------------------------
❽ C語言鏈表
structLtype
{
intv;
structLtype*pre;
structLtype*next;
}La[200],Lb[100];
main()
{
structLtype*pL,*pLc;
pL=ins_Lb(&La[0],&Lb[0]);
pLc=ins_Lc(&La[0],&Lb[0]);
if(pLc==NULL)
printf(" Error");
}
//第一種,插入到La
structLtype*ins_Lb(structLtype*pa,structLtype*pb)
{
structLtype*pa_head,*pa_temp,*pb_temp,*p;
pa_head=pa;//保存La頭;
if(pb==NULL)//Lb為空,直接返回La
returnpa;
if(pa==NULL)//La為空,返回Lb
{
pa=pb;
returnpa;
}
while(pa!=NULL&&pb!=NULL)//循環到一個鏈表結束
{
if(pa->v>pb->v)//找到非遞減位置,插入Lb節點
{
p=pa->pre;//La前一節點
p->next=pb;//La前一節點的下節點為Lb
pb->pre=p;//Lb前一節點為La前一節點
pb_temp=pb->next;//保存Lb的下一節點,為下一循環做准備
pb->next=pa;//Lb的下一節點為La當前節點
pb=pb_temp;//Lb取下一節點,La不變
}
else
{
pa_temp=pa;//保存La的當前非空節點,為La結束連接Lb做准備
pa=pa->next;//La取下一節點,Lb不變
}
}
if(pa==NULL&&pb!=NULL)
{
pa_temp->next=pb;//鏈接Lb剩餘部分。如果Lb為空,La自然保持剩餘鏈接狀態
}
returnpa_head;
}
//第三種,新建Lc
structLtype*ins_Lc(structLtype*pa,structLtype*pb)
{
structLtype*pc_head,*p_temp,*p;
inti=0;
//新建Lc節點
p=(structLtype*)malloc(sizeof(structLtype));
if(p==NULL)
{
returnNULL;
}
i++;
pc_head=pc;//保存Lc頭;
if(pa==NULL&&pb==NULL)//LaLb為空,直接返回
returnNUll;
while(pa!=NULL&&pb!=NULL)//循環到一個鏈表結束
{
//新建Lc節點
if(i!=1)//第一個Lc節點已經建立
{
p=(structLtype*)malloc(sizeof(structLtype));
if(p==NULL)
{
free(sizeof(sturctLtype)*i);
returnNULL;
}
i++;
p->pre=pc;
p->next=NULL;
pc->next=p;
pc=p;
}
if(pa->v>pb->v)
{
pc->v=pb->v;//Lb節點值
pb=pb->next;
}
else
{
pc->v=pa->v;//La節點值
pa=pa->next;
}
}
p_temp=pa!=NULL?pa:pb;
while(p_temp!=NULL)
{
//非空鏈表剩餘部分
//新建Lc節點
p=(structLtype*)malloc(sizeof(structLtype));
if(p==NULL)
{
free(sizeof(sturctLtype)*i);
returnNULL;
}
i++;
p->pre=pc;
p->next=NULL;
pc->next=p;
pc=p;
pc->v=p_temp->v;//節點值
p_temp=p_temp->next;
}
returnpc_head;
}
❾ 如何用C語言編寫一個鏈表
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"
struct Node
{
int data;//數據域
struct Node * next;//指針域
};
/*************************************************************************************
*函數名稱:Create
*函數功能:創建鏈表.
*輸入:各節點的data
*返回值:指針head
*************************************************************************************/
struct Node * Create()
{
struct Node *head,*p1,*p2;
head = NULL;
p1 = p2 = (struct Node *)malloc(sizeof(struct Node));
printf("Input the linklist (Input 0 to stop):\n");
scanf("%d",&p1->data);
while(p1->data!=0)
{
if(head == NULL){
head = p1;
}else{
p2->next = p1;
p2 =p1;
}
p1 = (struct Node *)malloc(sizeof(struct Node));
scanf("%d",&p1->data);
}
p2->next = NULL;
return head;
}
/*************************************************************************************
*函數名稱:insert
*函數功能:在鏈表中插入元素.
*輸入:head 鏈表頭指針,p新元素插入位置,x 新元素中的數據域內容
*返回值:無
*************************************************************************************/
void insert(struct Node * head,int p,int x)
{
struct Node * tmp = head;
struct Node * tmp2 ;
int i ;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return ;
if(i<p-1)
tmp = tmp->next;
}
tmp2 = (struct Node *)malloc(sizeof(struct Node));
tmp2->data = x;
tmp2->next = tmp->next;
tmp->next = tmp2;
}
/**************************************************************************************
*函數名稱:del
*函數功能:刪除鏈表中的元素
*輸入:head 鏈表頭指針,p 被刪除元素位置
*返回值:被刪除元素中的數據域.如果刪除失敗返回-1
**************************************************************************************/
int del(struct Node * head,int p)
{
struct Node * tmp = head;
int ret , i;
for(i = 0;i<p;i++)
{
if(tmp == NULL)
return -1;
if(i<p-1)
tmp = tmp->next;
}
ret = tmp->next->data;
tmp->next = tmp->next->next;
return ret;
}
/**************************************************************************************
*函數名稱:print
*函數功能:列印鏈表中的元素
*輸入:head 鏈表頭指針
*返回值:無
**************************************************************************************/
void print(struct Node *head)
{
struct Node *tmp;
for(tmp = head; tmp!=NULL; tmp = tmp->next)
printf("%d ",tmp->data);
printf("\n");
}
/**************************************************************************************
*函數名稱:main
*函數功能:主函數創建鏈表並列印鏈表。
**************************************************************************************/
int main(){
struct Node * head = Create();
print(head);
return 0;
}
❿ C語言裡面的鏈表是什麼
C語言裡面的鏈表是一種數據結構
是一種線形的存儲結構
鏈表和數組一樣,也是將一組同類型的數據組織在一起的一種數據結構
不同的是
數組採用的是順序存儲,依靠數組的首地址和元素的相對地址(下標)來實現訪問。
優點是訪問方便快捷,而缺點是數組是靜態的,不利於實現元素的動態增減。
而鏈表採用的是離散存儲,依靠節點間的指向下一個節點的指針來實現訪問。
其優缺點和數組相反