单链表基础练习
#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); //采用尾插法創建鏈表
LinkList createlist_tail(LinkList L, int n); //采用頭插法創建鏈表
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) //采用尾插法創建鏈表
{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) //采用頭插法創建鏈表
{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){ //將兩個結點的數據域交換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){ //將兩個結點的數據域交換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的前驅指針,如果找到位置時記錄插入位置前一個位置以輔助插入整個的循環是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; //釋放之前先保存下個節點的地址free(p); //通過p釋放當前節點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為帶頭結點單鏈表的頭指針//當第i個元素存在時,其值賦值給e并返回OK,否則返回ERRORLinkList p;int j = 1; //j為計數器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
總結
- 上一篇: PostgreSQL-JDBC疑似bug
- 下一篇: Proxy代理模式