當前位置:首頁 » 編程語言 » c語言演算法鏈表

c語言演算法鏈表

發布時間: 2023-07-14 10:48:43

Ⅰ 在C語言中,什麼是鏈表呀

鏈表由一系列結點(鏈表中每一個元素稱為結點)組成,結點可以在運行時動態生成。每個結點包括兩個部分:一個是存儲數據元素的數據域,另一個是存儲下一個結點地址的指針域。 相比於線性表順序結構,操作復雜。由於不必須按順序存儲,鏈表在插入的時候可以達到O(1)的復雜度,比另一種線性表順序錶快得多,但是查找一個節點或者訪問特定編號的節點則需要O(n)的時間,而線性表和順序表相應的時間復雜度分別是O(logn)和O(1)。
使用鏈表結構可以克服數組鏈表需要預先知道數據大小的缺點,鏈表結構可以充分利用計算機內存空間,實現靈活的內存動態管理。但是鏈表失去了數組隨機讀取的優點,同時鏈表由於增加了結點的指針域,空間開銷比較大。鏈表最明顯的好處就是,常規數組排列關聯項目的方式可能不同於這些數據項目在記憶體或磁碟上順序,數據的存取往往要在不同的排列順序中轉換。鏈表允許插入和移除表上任意位置上的節點,但是不允許隨機存取。鏈表有很多種不同的類型:單向鏈表,雙向鏈表以及循環鏈表。鏈表可以在多種編程語言中實現。像Lisp和Scheme這樣的語言的內建數據類型中就包含了鏈表的存取和操作。程序語言或面向對象語言,如C,C++和Java依靠易變工具來生成鏈表。

Ⅱ C語言鏈表的使用方法

D
答案D設置完,p就從鏈表中丟掉了。
p就是一個指向結構體node的指針。
p->next就是p包含的執行下一個node的指針,在本題,就是q。

Ⅲ 如何用C語言創建一個鏈表,實現增、刪、改、查

#includex0dx0a#includex0dx0a#include x0dx0a//先定義一種student類型,表示一個學生的信息,如下:x0dx0atypedef struct studentx0dx0a{x0dx0aint num; //表示學號x0dx0achar name[30]; //表示姓名x0dx0afloat score; //表示分數x0dx0a}student;x0dx0a//定義一種NODE類型,表示一個結點信息,如下:x0dx0atypedef struct nodex0dx0a{x0dx0astudent st; //表示一個學生的信息x0dx0astruct node *next; //表示一個NODE類型的指針x0dx0a}NODE;x0dx0a//1、寫出建立一頌老個帶頭結點的線性鏈表的函數,侍櫻亂其中每個結點包括學號、姓名、分數三個數據域。函數形式如下:x0dx0aNODE *creat_link(int direction)x0dx0a{x0dx0aNODE *head,*p,*tail;x0dx0aint xh,i=1;x0dx0aif(direction==1) //當direction的值為1時,新建立的結點連到尾部x0dx0a{x0dx0atail=head=(NODE *)malloc(sizeof(NODE));x0dx0ahead->next=NULL;x0dx0aprintf("請輸入第%d個學生的學號:",i);x0dx0ascanf("%d",&xh);x0dx0awhile(xh>0) //從鍵盤臨時輸入學生情況,當輸入的學號非正,則鏈表建立完畢x0dx0a{x0dx0ap=(NODE *)malloc(sizeof(NODE));x0dx0ap->st.num=xh;x0dx0aprintf("請輸入第%d個學生的姓名:",i);x0dx0ascanf("%s",p->st.name);x0dx0aprintf("請輸入第%d個學生的成績:",i);x0dx0ascanf("%f",&p->st.score);x0dx0ap->next=NULL;x0dx0atail->next=p;x0dx0atail=p;x0dx0ai=i+1;x0dx0aprintf("請輸入第%d個學生的學號:",i);x0dx0ascanf("%d",&xh);x0dx0a}x0dx0a}x0dx0aelse if(direction==0) //當direction為0時,新建立的結點成為第一個結點x0dx0a{x0dx0ahead=(NODE *)malloc(sizeof(NODE));x0dx0ahead->next=NULL;x0dx0aprintf("請輸入第%d個學生的學號:",i);x0dx0ascanf("%d",&xh);x0dx0awhile(xh>0) //從鍵盤臨時輸入學生情況,老檔當輸入的學號非正,則鏈表建立完畢x0dx0a{x0dx0ap=(NODE *)malloc(sizeof(NODE));x0dx0ap->st.num=xh;x0dx0aprintf("請輸入第%d個學生的姓名:",i);x0dx0ascanf("%s",p->st.name);x0dx0aprintf("請輸入第%d個學生的成績:",i);x0dx0ascanf("%f",&p->st.score);x0dx0ap->next=head->next;x0dx0ahead->next=p;x0dx0ai=i+1;x0dx0aprintf("請輸入第%d個學生的學號:",i);x0dx0ascanf("%d",&xh);x0dx0a}x0dx0a}x0dx0areturn head;x0dx0a}x0dx0a//2、寫出輸出上述鏈表各結點數據域值的函數。該函數對應的函數需要一個形參,表示鏈表的頭指針,形式如下:x0dx0avoid print_link(NODE *head)x0dx0a{x0dx0aNODE *p;x0dx0ap=head->next;x0dx0aprintf("%-10s%-20s%-10s\n","學號","姓名","分數");x0dx0awhile(p!=NULL)x0dx0a{x0dx0aprintf("%-10d%-20s%-10.1f\n",p->st.num,p->st.name,p->st.score);x0dx0ap=p->next;x0dx0a}x0dx0a//該函數能輸出head所指的鏈表的所有結點值,輸出形式如下:x0dx0a/*本函數輸出線性表sq中所有數據,形式如下:x0dx0a學號 姓名 分數x0dx0a12 張三 234.5x0dx0a18 李四 987.7x0dx0a??? ??? ??.*/x0dx0a}x0dx0a//3、寫出在鏈表中刪除結點的函數x0dx0aint del_link(NODE *head,char name[])x0dx0a{x0dx0aNODE *p,*p1;x0dx0ap=head->next;x0dx0ap1=head;x0dx0awhile(p!=NULL)x0dx0a{x0dx0aif(strcmp(p->st.name,name)!=0)x0dx0a{x0dx0ap1=p;x0dx0ap=p->next;x0dx0a}x0dx0aelsex0dx0a{x0dx0abreak;x0dx0a}x0dx0a}x0dx0aif(p!=NULL)x0dx0a{x0dx0ap1->next=p->next;x0dx0afree(p);x0dx0areturn 1;x0dx0a}x0dx0aelsex0dx0a{x0dx0areturn 0;x0dx0a}x0dx0a//刪除head所指的鏈表中,名字為name的結點,刪除成功返回1,不成功返回0x0dx0a}x0dx0a//4、寫出在鏈表中插入結點的演算法x0dx0aint insert(NODE *head,student x,int wz)x0dx0a{x0dx0aNODE *p=head;x0dx0aint i=0,jg;x0dx0aif(wz<=0)x0dx0a{x0dx0ajg=0;x0dx0a}x0dx0aelsex0dx0a{x0dx0awhile(inext;x0dx0a}x0dx0aif(p==NULL)x0dx0a{x0dx0ajg=0;x0dx0a}x0dx0aif(i=wz-1)x0dx0a{x0dx0a//找到wz前面的節點,p指向它x0dx0aNODE *q;x0dx0aq=(NODE *)malloc(sizeof(NODE));x0dx0aq->st.num=x.num;x0dx0astrcpy(q->st.name,x.name);x0dx0aq->st.score=x.score;x0dx0aq->next=p->next;x0dx0ap->next=q;x0dx0ajg=1;x0dx0a}x0dx0a}x0dx0areturn jg;x0dx0a//該函數能夠在wz這個結點之前,插入一個新結點,新結點的數據域為x。插入成功返回1,不成功返回0。x0dx0a}x0dx0a//5、寫出主函數,分別調用上面演算法所對應的程序,建立鏈表,並輸出鏈表的值。x0dx0avoid main()x0dx0a{x0dx0aNODE *head; //定義指針變數headx0dx0aint wz; //表示插入位置x0dx0achar xm[30];x0dx0astudent st; //定義一個變數st,用來表示一個學生的信息x0dx0ahead=creat_link(1);x0dx0aprint_link(head); //調用函數建立鏈表,並把返回值送給head;x0dx0a//調用函數,輸出鏈表中各個結點的值x0dx0a//輸入一個學生的有關信息,送給變數st的有關成員x0dx0aprintf("\n\n請輸入要插入的位置:");x0dx0ascanf("%d",&wz); //輸入wz的值x0dx0aprintf("請輸入要插入的學生的學號:");x0dx0ascanf("%d",&st.num);x0dx0aprintf("請輸入要插入的學生的姓名:");x0dx0ascanf("%s",st.name);x0dx0aprintf("請輸入要插入的學生的成績:");x0dx0ascanf("%f",&st.score); x0dx0a//調用函數,在鏈表中把學生st的值作為一個結點插入,如果插入成功,輸出新鏈表x0dx0aif(insert(head,st,wz)==1)x0dx0a{x0dx0aprintf("\n插入成功,新表為:\n");x0dx0aprint_link(head);x0dx0a}x0dx0aelsex0dx0a{x0dx0aprintf("插入不成功");x0dx0a}x0dx0a//調用函數,在鏈表中刪除一個指定結點的值,如果刪除成功,輸出新鏈表x0dx0aprintf("\n\n請輸入要刪除的學生的姓名:");x0dx0agetchar();x0dx0agets(xm);x0dx0aif(del_link(head,xm)==1)x0dx0a{x0dx0aprintf("\n刪除成功,新表為:\n");x0dx0aprint_link(head);x0dx0a}x0dx0aelsex0dx0a{x0dx0aprintf("刪除不成功");x0dx0a}x0dx0a}

Ⅳ C語言做鏈表的排序

主要修改了sort函數,採用冒泡排序演算法進行排序的。
你其他的兩個函數寫的不錯,就sort函數寫的有問題,已經很不錯了。
注意:程序結束,最好對鏈表進行銷毀,否則,內存永遠也不會釋放,導致內存泄漏了。

修改如下:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>

#define N 5
typedef struct node
{
char name[20];
int score;
struct node *link;
}stud;

stud *sort(stud *head) /*排序函數*/
{
stud *temp=NULL; //默認為NULL,也就是鏈表的結尾
stud *ptr1=head;
stud *ptr2=head->link;

while(ptr1->link!=temp)//(ptr1!=NULL)
{
//ptr2=ptr1->link; //放在循環體下面了
while(ptr2->link!=temp)//(ptr2!=NULL)
{
if(ptr1->link->score > ptr2->link->score) //(ptr1->score > ptr2->score)
{//交換 ptr1->link和ptr2->link,而不是ptr1和ptr2,否則無法交換
ptr1->link=ptr2->link;
ptr2->link=ptr2->link->link;//temp->link=ptr2;
ptr1->link->link=ptr2;//ptr2->link=ptr1;
}
ptr1=ptr1->link;//ptr2=ptr2->link;
ptr2=ptr1->link;//從上面移動下來的
}
temp=ptr2;//新加的
ptr1=head;//ptr1=ptr1->link;
ptr2=ptr1->link;//從上面移動下來的
}
return (head);
}

stud * creat(int n)
{
stud *p,*h,*s;
int i;

if((h=(stud *)malloc(sizeof(stud)))==NULL)
{
printf("不能分配內存空間!");
exit(0);
}
h->name[0]='\0';
h->link=NULL;
p=h;
for(i=0;i<n;i++)
{
if((s= (stud *) malloc(sizeof(stud)))==NULL)
{
printf("不能分配內存空間!");
exit(0);
}
s->link=NULL;//p->link=s; //跟下句對調了一下,為了把相關的代碼放在一起
printf("請輸入第%d個人的姓名",i+1);
scanf("%s",s->name);
printf("請輸入第%d個人的分數",i+1);
scanf("%d",&s->score);
p->link=s; //s->link=NULL;//跟上句對調了一下,為了把相關的代碼放在一起
p=s;
}
return(h);
}

void print(stud *h)
{
stud *p;

p=h->link;
printf("數據信息為:\n");
while(p!=NULL)
{
printf("%s ",&*(p->name));
printf("的分數為%d\n",p->score);
p=p->link;
}
}

void main()
{
stud *head;
head=creat(N);
head=sort(head);
print(head);
getchar();
}

Ⅳ 如何用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語言單鏈表演算法問題

#include <stdio.h>
#include <stdlib.h>
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList *L);
void ListDeleteMax(LinkList L,int *e);
int ListInsert(LinkList L,int i,int e);
void DestroyList(LinkList L);
void ListTraverse(LinkList L);
int main(void)
{
LinkList L;
int i,j,m;
int a[]={6,5,4,3,2,1};
InitList(&L);
for(i=0; i<6; ++i)
m = ListInsert(L,i+1,a[i]);
printf("鏈表的內容為:");
ListTraverse(L);
ListDeleteMax(L,&j);
printf("刪除最大元素%d後,鏈表的內容為:",j);
ListTraverse(L);
DestroyList(L);
return 0;
}
void InitList(LinkList *L)
{
*L = (LinkList )malloc(sizeof(LNode));
if(!*L)
exit(-1);
(*L)->next = NULL;
}
int ListInsert(LinkList L,int i,int e)
{
int j=0;
LinkList p = L;
LinkList s;
while(p&&j<i-1)
{
p = p->next;
j++;
}
if(!p || j>i-1)
{
return 0;
}
s = (LinkList)malloc(sizeof(LNode));
s ->data = e;
s->next = p->next;
p->next = s;
return 1;
}
void ListDeleteMax(LinkList L,int *e) //刪除最大元素
{
LinkList p = L->next;
LinkList s = L; //s指向最大結點前面的結點
LinkList q;
int m = p->data; //m保存最大的值
while(p->next)
{
q=p->next;
if(q->data > m)
{
m = q->data;
s = p;
}
p=p->next;
}
q = s->next;
s->next = q->next;
*e = q->data;
free(q);
}
void DestroyList(LinkList L)
{
LinkList q;
while(L)
{
q = L->next;
free(L);
L = q;
}
}
void ListTraverse(LinkList L)
{
LinkList p = L->next;
while(p)
{
printf("%d ",p->data);
p = p->next;
}
printf("\n");
}

Ⅶ C語言里的鏈表

首先你要明白鏈表是什麼,鏈表中有1個數據區域和1個指針區域,指針區域存放的是下一個節點的地址(如果有下個節點的話),這是單鏈表,如果是雙鏈表的話,那麼有2個指針區域,1個指向前1個節點的地址,1個指向後1個節點的地址,如果對鏈表不是很熟悉,得先去看看數據結構,鏈表並不是數據結構裡面的東西。
接下來我們看看在C語言中如何表示鏈表。
typedef struct Linklist
{
int data;
struct Linklist * next;
}Linklist;
定義一個結構體來表示鏈表,int data 代表數據,根據實際情況自己修改,struct Linklist * next 代表指針,指向下1個節點的,比如現在有3個節點A B C ,如果他們的next為NULL ,這3個節點就是毫無關系的,分散的,如果定義A->next =&B B->next=&C 那麼他們就變成鏈表了,即A->B->C
如果是雙鏈表,那麼在結構體中定義的時候加上struct Linklist * prev 這個指針指向前1個節點的地址,比如A->next=&B B->prev=&A 那麼現在雙鏈表就為A B相互指向,這里不好畫出來就沒畫了。
至於鏈表的添加,刪除之類的可以再看看C語言裡面的,如果還不會在來問我吧~

熱點內容
有壓縮錢嗎 發布:2025-02-08 16:34:01 瀏覽:516
折紙手工解壓小方塊 發布:2025-02-08 16:32:45 瀏覽:252
php與運算符 發布:2025-02-08 16:32:45 瀏覽:762
如何用伺服器搭建懸賞平台 發布:2025-02-08 16:29:53 瀏覽:278
ftp伺服器破解版 發布:2025-02-08 16:28:41 瀏覽:521
mysql配置訪問ip 發布:2025-02-08 16:22:49 瀏覽:116
體表面積簡易演算法 發布:2025-02-08 16:18:04 瀏覽:687
存儲器的分級儲存是如何實現的 發布:2025-02-08 16:11:27 瀏覽:193
電腦怎麼看路由器密碼 發布:2025-02-08 16:10:13 瀏覽:401
匯編宏編譯 發布:2025-02-08 16:08:30 瀏覽:194