日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

c语言输出单链表最大值与最小值,数据结构(C语言版)---顺序表与链表的比较...

發布時間:2025/3/15 编程问答 14 豆豆
生活随笔 收集整理的這篇文章主要介紹了 c语言输出单链表最大值与最小值,数据结构(C语言版)---顺序表与链表的比较... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、存取方式

1)順序表:可以順序存取,也可以隨機存取。

2)鏈表:只能從表頭順序存取。

2、邏輯結構與物理結構

1)順序存儲:邏輯上相鄰,物理位置相鄰。

2)鏈式存儲:邏輯上相鄰,物理位置不一定相鄰。

3、查找、插入、刪除

1)按值查找:當表中數據無序時,順序表和鏈表,時間復雜度為O(n)。

當表中數據有序時,順序表可采用折半查找,時間復雜度為O(log2n)。

2)按序號查找:順序表,時間復雜度為O(1)。

鏈表,時間復雜度為O(n)。

3)插入和刪除:順序表,平均需要移動半個表長的元素

鏈表,只需修改相關結點的指針域。

4、單鏈表中一些簡單題目的解決

1)L為帶頭結點的單鏈表,刪除L中所有值為x的結點

void delx1(Linklist &L, int x)

{

LNode * p = L->next, *pre = L, *q;

while (p!=NULL)

{

if (p->data == x)

{

q = p;

p = p->next;

pre->next = p;

free(q);

}

else

{

pre = p;

p = p->next;

}

}

}

void delx2(Linklist &L, int x)

{

LNode * p = L->next, *r = L, *q;

while (p!=NULL)

{

if (p->data != x)

{

r->next = p;

r = p;

p = p->next;

}

else

{

q = p;

p = p->next;

free(q);

}

}

r->next = NULL;

}

2)用遞歸實現刪除L中所有值為x的結點

void delx3(Linklist &L, int x)

{

LNode * p;

if (L == NULL)

{

return;

}

if (L->data == x)

{

p = L;

L = L->next;

free(p);

delx3(L, x);

}

else

{

delx3(L->next, x);

}

}

3)L為帶頭結點的單鏈表,刪除L中最小值結點

Linklist delmin(Linklist &L)

{

LNode * pre = L, *p = pre->next;

LNode * minpre = pre, *minp = p;

while (p!=NULL)

{

if (p->data < minp->data)

{

minp = p;

minpre = pre;

}

pre = p;

p = p->next;

}

minpre->next = minp->next;

free(minp);

return L;

}

4)L為遞增有序的單鏈表,刪除表中值相同的元素

void delsame(Linklist &L)

{

LNode * p = L->next, *q;

if (p == NULL)

{

return;

}

while (p->next!=NULL)

{

q = p->next;

if (p->data == q->data)

{

p->next = q->next;

free(q);

}

else

{

p = p->next;

}

}

}

5)L為帶頭結點的單鏈表,將L就地逆置

Linklist reverse1(Linklist L)

{

LNode * p, *r;

p = L->next;

L->next = NULL;

while (p!=NULL)

{

r = p->next;

p->next = L->next;

L->next = p;

p = r;

}

return L;

}

Linklist reverse2(Linklist L)

{

LNode * pre, *p = L->next, *r = p->next;

p->next = NULL;

while (r!=NULL)

{

pre = p;

p = r;

r = r->next;

p->next = pre;

}

L->next = p;

return L;

}

6)將單鏈表L結點重排,使遞增有序

void sort(Linklist &L)

{

LNode * p = L->next, *pre;

LNode * r = p->next;

p->next = NULL;

p = r;

while (p!=NULL)

{

r = p->next;

pre = L;

while (pre->next != NULL && pre->next->datadata)

{

pre = pre->next;

}

p->next = pre->next;

pre->next = p;

p = r;

}

}

7)帶頭結點的單鏈表L,頭指針為head,遞增輸出表中數據

void del(Linklist &head)

{

LNode * p, * pre,* q;

while (head->next!=NULL)

{

pre = head;

p = pre->next;

while (p->next!=NULL)

{

if (p->next->data < pre->next->data)

{

pre = p;

}

p = p->next;

}

printf("%d",pre->next->data);

q = pre->next;

pre->next = q->next;

free(q);

}

free(head);

}

8)將表A中的數據按序號的就奇偶性分解到表AB中,對B表的建立采用尾插法

Linklist listcreat1(Linklist &A)

{

Linklist B;

int i = 0;

B = (Linklist)malloc(sizeof(LNode));

B->next = NULL;

LNode * ra = A, * rb = B,* p;

p = A->next;

A->next = NULL;

while (p!= NULL)

{

i++;

if (i % 2 == 0)

{

rb->next = p;

rb = p;

}

else

{

ra->next = p;

ra = p;

}

p = p->next;

}

ra->next = NULL;

rb->next = NULL;

return B;

}

9)將表A中的數據按序號的就奇偶性分解到表AB中,對B表的建立采用頭插法

Linklist listcreat2(Linklist &A)

{

Linklist B = (Linklist)malloc(sizeof(LNode));

B->next = NULL;

LNode * p = A->next, * q;

LNode * ra = A;

while (p!=NULL)

{

ra->next = p;

ra = p;

p = p->next;

q = p->next;

p->next = B->next;

B->next = p;

p = q;

}

ra->next = NULL;

return B;

}

10)把柄兩個遞增有序單鏈表帶頭結點,和并后鏈表遞減排列

void listmerge(Linklist &La, Linklist &Lb)

{

LNode * r, *pa = La->next, *pb = Lb->next;

La->next = NULL;

while (pa&&pb)

{

if (pa->data <= pb->data)

{

r = pa->next;

pa->next = La->next;

La->next = pa;

pa = r;

}

else

{

r = pb->next;

pb->next = La->next;

La->next = pb;

pb = r;

}

}

if (pa)

{

pb = pa;

}

while (pb)

{

r = pb->next;

pb->next = La->next;

La->next = pb;

pb = r;

}

free(Lb);

}

11)將鏈表AB中的公共元素組成鏈表C

void getcom(Linklist A, Linklist B)

{

LNode * p = A->next, *q = B->next, *r, *s;

Linklist C = (Linklist)malloc(sizeof(LNode));

r = C;

while (p!=NULL&&q!=NULL)

{

if (p->data < q->data)

{

p = p->next;

}

else if(p->data>q->data)

{

q = q->next;

}

else

{

s = (LNode *)malloc(sizeof(LNode));

s->data = p->data;

r->next = s;

r = s;

p = p->next;

q = q->next;

}

}

r->next = NULL;

}

12)將兩個鏈表進行集合相等的值只保留一個,將其余結點釋放

Linklist listunion(Linklist &la, Linklist &lb)

{

LNode * pa, * pb,* pc,* pu;

pa = la->next;

pb = lb->next;

pc = la;

while (pa&&pb)

{

if (pa->data == pb->data)

{

pc->next = pa;

pc = pa;

pa = pa->next;

pu = pb;

pb = pb->next;

free(pu);

}

else if (pa->data < pb->data)

{

pu = pa;

pa = pa->next;

free(pu);

}

else

{

pu = pb;

pb = pb->next;

free(pu);

}

}

while (pa)

{

pu = pa;

pa = pa->next;

free(pu);

}

while (pb)

{

pu = pb;

pb = pb->next;

free(pu);

}

pc->next = NULL;

free(lb);

return la;

}

13)單鏈表AB,判斷B是否是A的子序列

int pattern(Linklist A, Linklist B)

{

LNode * p = A, *pre = p, *q = B;

while (p&&q)

{

if (p->data == q->data)

{

p = p->next;

q = q->next;

}

else

{

pre = pre->next;

p = pre;

q = B;

}

}

if (q == NULL)

{

return 1;

}

else

{

return 0;

}

}

5、鏈表的一些簡單問題的實現

1)從兩頭掃描循環雙鏈表,判斷是否對稱

int symmetry(DLinklist L)

{

DNode * p = L->next, *q = L->prior;

while (p!=q&&p->next!=q)

{

if (p->data == q->data)

{

p = p->next;

q = q->prior;

}

else

{

return 0;

}

}

return 1;

}

2)每次刪除循環單鏈表中最小的元素,直到鏈表為空

void delall(Linklist &L)

{

LNode * p, *pre, *minp, *minpre;

while (L->next != L)

{

p = L->next;

pre - L;

minp = p;

minpre = pre;

while (p != L)

{

if (p->data < minp->data)

{

minp = p;

minpre = pre;

}

pre = p;

p = p->next;

}

printf("%d", minp->data);

minpre->next = minp->next;

free(minp);

}

free(L);

}

3)將循環鏈表h2鏈接到循環鏈表h1之后,使之仍保持循環鏈表的形式

Linklist link(Linklist &h1, Linklist &h2)

{

LNode * p, *q;

p = h1;

while (p->next!=h1)

{

p = p->next;

}

q = h2;

while (q->next!=h2)

{

q = q->next;

}

p->next = h2;

q->next = h1;

return h1;

}

標簽:pre,Linklist,NULL,pb,next,鏈表,表與,C語言,data

來源: https://www.cnblogs.com/xqy1874/p/12721261.html

總結

以上是生活随笔為你收集整理的c语言输出单链表最大值与最小值,数据结构(C语言版)---顺序表与链表的比较...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。