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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

单链表基础练习

發(fā)布時間:2025/7/14 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单链表基础练习 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
#include<stdio.h> #include<stdlib.h> #define OK 1 #define ERROR -1 typedef struct LNode {int data;struct LNode *next; }LNode, *LinkList; LinkList createlist(LinkList L, int n); //采用尾插法創(chuàng)建鏈表 LinkList createlist_tail(LinkList L, int n); //采用頭插法創(chuàng)建鏈表 LinkList bing(LinkList La, LinkList Lb); //合并兩個鏈表 void showList(LinkList L); //打印鏈表 void selectsort_low(LinkList L); //直接選擇排序-降序排序 void selectsort_high(LinkList L); //直接選擇排序-升序排序 void Insertsort_high(LinkList L); //直接插入排序-升序排序 void Insertsort_low(LinkList L); //直接插入排序-降序排序 void freeList(LinkList L); //釋放鏈表 int ListDelete_L(LinkList L, int i, int *e); //刪除第i個元素,并由e返回其值 int ListInsert_L(LinkList L, int i, int e); //在第i個位置前插入元素e int GetElem_L(LinkList L, int i, int *e); //查找第i個元素,存在則返回OK,否則ERRORLinkList createlist(LinkList L, int n) //采用尾插法創(chuàng)建鏈表 {int i;LinkList p, r;L = (LinkList)malloc(sizeof(LNode));if (L == NULL)exit(1);r = L; //r是尾指針for (i = 1; i <= n; i++){p = (LinkList)malloc(sizeof(LNode));if (!p){printf(" Not enough heap ");exit(1);}scanf("%d", &p->data);r->next = p; //將新結點p連入r的后邊r = p;}r->next = NULL;return L; }LinkList createlist_tail(LinkList L, int n) //采用頭插法創(chuàng)建鏈表 {int i;LinkList p;L = (LinkList)malloc(sizeof(LNode));if (L == NULL)exit(1);for (i = 1; i <= n; i++){p = (LinkList)malloc(sizeof(LNode));if (!p){printf(" Not enough heap ");exit(1);}scanf("%d", &p->data);p->next = L->next; //把新建立的結點插入到上一個結點的前面,表頭L-->|2|-->|1|-->NULL L->next = p;}return L; }LinkList bing(LinkList La, LinkList Lb) { //La和Lb是非遞減的,求La和Lb的并集LinkList pa, pb, pc, t;pa = La->next;pc = La;pb = Lb->next;while (pa&&pb){if (pa->data<pb->data){pc->next = pa;pc = pa;pa = pa->next;}else if (pa->data>pb->data){pc->next = pb;pc = pb;pb = pb->next;}else{pc->next = pa;pc = pa;pa = pa->next;t = pb;pb = pb->next;free(t);}}pc->next = pa ? pa : pb;free(Lb);return La; }void showList(LinkList L) {LinkList p;p = L->next;printf("The La is:");while (p){printf("%d ", p->data);p = p->next;}printf("\n"); }void selectsort_low(LinkList L) //降序排序 {int temp;LinkList p, q, m;if (!L->next || !L->next->next)return;p = L->next; //p指向第一個結點while (p->next){m = p; //m指向當前最大結點q = p->next;while (q){if (q->data > m->data)m = q;q = q->next;}if (p != m){ //將兩個結點的數(shù)據(jù)域交換temp = m->data;m->data = p->data;p->data = temp;}p = p->next;} //while(q->next) }void selectsort_high(LinkList L) //升序排序 {int temp;LinkList p, q, m;if (!L->next || !L->next->next)return;p = L->next; //p指向第一個結點while (p->next){m = p; //m指向當前最小結點q = p->next;while (q){if (q->data < m->data)m = q;q = q->next;}if (p != m){ //將兩個結點的數(shù)據(jù)域交換temp = m->data;m->data = p->data;p->data = temp;}p = p->next;} //while(q->next) } //selectsortvoid Insertsort_high(LinkList L) {/*p 指針指向下一個需要插入到鏈表的結點q指針是找到已生成鏈表的部分中P應該插入的位置r指針指向q的前驅指針,如果找到位置時記錄插入位置前一個位置以輔助插入整個的循環(huán)是P取完所有結點之后結束的(即所有的結點都已按順序插入了)比較p->data與q->data的值用來找到插入位置的*/int count = 0;LinkList p, q, r, u;p = L->next; L->next = NULL; //置空表,然后將原鏈表結點逐個插入到有序表中while (p != NULL) { //當鏈表尚未到尾,p為當前指針r = L; q = L->next;while (q != NULL&&q->data <= p->data) { //查p結點在鏈表中的插入位置,這時q是當前指針r = q; q = q->next;}count++;u = p->next; p->next = r->next; r->next = p; p = u; //將P結點鏈入鏈表中,r是q的前驅,u是下一個待插入結點的指針printf("\n第%d趟后為:", count);showList(L);} }void Insertsort_low(LinkList L) {int count = 0;LinkList p, q, r, u;p = L->next; L->next = NULL; //置空表,然后將原鏈表結點逐個插入到有序表中while (p != NULL) { //當鏈表尚未到尾,p為當前指針r = L; q = L->next;while (q != NULL&&q->data > p->data) { //查p結點在鏈表中的插入位置,這時q是當前指針r = q; q = q->next;}count++;u = p->next;p->next = r->next;r->next = p;p = u; //將P結點鏈入鏈表中,r是q的前驅結點,u是下一個待插入結點的指針printf("\n第%d趟后為:", count);showList(L);} }void freeList(LinkList L) {LinkList p = L; //釋放鏈表if (!L) return;do {L = L->next; //釋放之前先保存下個節(jié)點的地址free(p); //通過p釋放當前節(jié)點p = L; //更新p} while (p != NULL); }int ListInsert_L(LinkList L, int i, int e) {LinkList p, s;int j = 0;p = L;while (p&&j < i - 1){p = p->next;++j; //尋找第i個結點}if (!p || j > i - 1) //i小于1或者大于表長+1return ERROR;s = (LinkList)malloc(sizeof(LNode));s->data = e;s->next = p->next;p->next = s;return OK; }int ListDelete_L(LinkList L, int i, int *e) {LinkList p, q;int j = 0;p = L;while (p->next && j < i - 1) { //尋找第i個結點,并令p指向其前驅p = p->next;++j;}if (!(p->next) || j > i - 1) //刪除位置不合理return ERROR;q = p->next;p->next = q->next;*e = q->data;free(q);return OK; }int GetElem_L(LinkList L, int i, int *e) {// L為帶頭結點單鏈表的頭指針//當?shù)趇個元素存在時,其值賦值給e并返回OK,否則返回ERRORLinkList p;int j = 1; //j為計數(shù)器p = L->next;while (p && j < i) { //直到p為空或者找到第i個元素p = p->next;++j;}if (!p || j > i)return ERROR;*e = p->data;return OK; }int main(void) {LinkList La = NULL, Lb = NULL;int n = 6;int e;printf("Input %d numbers for La:\n", n);La = createlist(La, n);showList(La);selectsort_high(La); //直接選擇排序-升序排序printf("直接選擇排序-升序:");showList(La);selectsort_low(La); //直接選擇排序-降序排序printf("直接選擇排序-降序:");showList(La);Insertsort_high(La); //直接插入排序-升序排序printf("\n最后直接插入排序-升序:");showList(La);Insertsort_low(La); //直接插入排序-降序排序printf("\n最后直接插入排序-降序:");showList(La);printf("\n在第2個元素前面插入元素6:");ListInsert_L(La, 2, 6);showList(La);GetElem_L(La, 2, &e);printf("\n第%d個元素是%d\n",2,e);printf("\n刪除第4個元素");ListDelete_L(La, 4, &e);printf(",刪除的元素為%d\n",e);showList(La);printf("\nInput %d numbers for Lb:\n", n);Lb = createlist(Lb, n);printf("\nThe Lb is:");showList(Lb);La = bing(La, Lb);printf("\nLa 和 Lb 合并之后:");showList(La);freeList(La); //釋放 }

樣例輸入:
9 6 3 2 1 86
6 95 4 1 2 -2

?

?

轉載于:https://www.cnblogs.com/FlyerBird/p/9052553.html

總結

以上是生活随笔為你收集整理的单链表基础练习的全部內容,希望文章能夠幫你解決所遇到的問題。

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