鏈表反轉c語言
① 用C語言編一個程序:兩個遞增有序鏈表合並成一個遞減鏈表,
#include<stdio.h>
#include <stdlib.h>
typedef struct node
{
int data;
struct node *next;
}node,*list;
void init(list &head)
{
head=(list)malloc(sizeof(node));
head->next=NULL;
}
void input(list &h)
{
list p,q;
q=h;
printf("輸入數據的個數 n : ");
int n;
scanf("%d",&n);
printf("請輸入 %d 個有序遞增數據:\n",n);
for (int i=0;i<n;i++)
{
// printf("第 %d 個: ",i+1);
p=(list)malloc(sizeof(node));
scanf("%d",&p->data);
p->next=q->next;
q->next=p;
q=p;
}
}
void output(list h)
{
list p;
p=h->next;
printf("輸出數據\n");
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
void combine(list &a,list &b,list &c)
{
list p,q,t;
p=a->next;
q=b->next;
free(b);
b=q;
c=a;
a=p;
c->next=NULL;
while(p&&q)
{
if (p->data<=q->data)
{
a=a->next;
p->next=c->next;
c->next=p;
p=a;
}
else
{
b=q->next;
q->next=c->next;
c->next=q;
q=b;
}
}
if (p!=NULL)
{
while(p)
{
a=a->next;
p->next=c->next;
c->next=p;
p=a;
}
}
if (q!=NULL)
{
while(q)
{
b=q->next;
q->next=c->next;
c->next=q;
q=b;
}
}
}
void main()
{
list a,b,c;
init(a);init(b);
printf("\n輸入鏈表A :\n");
input(a);
printf("\n輸入鏈表B :\n");
input(b);
printf("輸出合並後的鏈表:\n");
combine(a,b,c);
output(c);
}
結果:
輸入鏈表A :
輸入數據的個數 n : 3
請輸入 3 個有序遞增數據:
4 5 9
輸入鏈表B :
輸入數據的個數 n : 4
請輸入 4 個有序遞增數據:
2 3 7 10
輸出合並後的鏈表:
輸出數據
10 9 7 5 4 3 2
Press any key to continue
② C語言必背100代碼,C語言必會100代碼大全
對於C語言初學者而言,掌握基礎的關鍵代碼至關重要。本文匯總了100個C語言必備代碼示例,旨在幫助你快速上手和理解編程邏輯。以下是部分內容概要:
- 1. 簡單輸出:通過C語言編寫九九乘法表,理解循環和條件語句的應用。
- 2. 數組處理:實現4x4數組的逆時針旋轉,鍛煉數組操作和邏輯思維。
- 3. 數學問題:用C解決兔子繁殖問題,探索遞歸和數列的概念。
- 4. 素數檢測:編寫程序判斷並輸出101-200之間的素數,學習基本演算法設計。
- 5. 完數查找:編寫代碼找出1000以內的完數,理解因子和數學規律。
- 6. 三角形列印:列印直角楊輝三角,練習控制台輸出和圖形表示。
- 7. 平均成績計算:輸入成績計算學生和課程的平均值,涉及輸入處理和數組操作。
- 8. 反向字元串:實現字元串反轉,練習指針和字元操作。
- 9-11. 排序演算法:包含從大到小和從小到大排序,掌握基本排序方法。
- 12. 字元串替換:編寫函數實現字元串替換,了解字元串處理函數。
- 13. 查找子串:理解字元串搜索演算法,用C語言查找指定子串。
- 14-15. 結構體和鏈表:使用指針操作結構體數組和創建簡單鏈表,接觸數據結構。
- 16. 冒泡排序:實現冒泡排序,鍛煉代碼優化和演算法實現。
- 17. 迴文判斷:輸入字元串並檢查是否為迴文,練習字元串比較。
- 18. 函數編寫:計算π的近似值,學習函數設計和精度控制。
這些代碼涵蓋了C語言的基礎操作,通過不斷實踐和理解,你將逐漸熟悉和掌握C語言的核心概念。
③ C語言反轉鏈表的遞歸演算法
/*在你遞歸之後的p一定要p->next=NULL;就可以了整個修改後的程序如下:(vs2005下運行正常)*/
#include <stdio.h>
#include<stdlib.h>
#include <malloc.h>
#include<conio.h>
typedef struct link
{ int data;
struct link *next;
}node;
node *createList()
{
node *pre, *cur, *head;
int temp;
head = (node *)malloc(sizeof(node));
if(head == NULL)
{
printf("Malloc failed!\n");
exit(0);
}
head->data = 0;
head->next = NULL; /*這樣負值效率較低,絕大部分都在做無用功,
只要在這個for循環後把最後一個賦予NULL就可以了*/
pre = head;
printf("Input data:");
scanf("%d", &temp);
while(temp!=0)
{
cur = (node *)malloc(sizeof(node));
if(cur == NULL)
{
printf("Malloc failed!\n");
exit(0);
}
cur->data = temp;
cur->next = NULL;
pre->next = cur;
pre = cur;
printf("Input data:");
scanf("%d", &temp);
}
return head;
}
void printList(node **head)/*實際上形參為 node * head就可以了,不知道你為啥這么寫,沒必要*/
{
node *temp;
temp = (*head)->next;
if(head == NULL)
return;
while(temp)
{
printf("\t%d", temp->data);
temp = temp->next;
}
printf("\nOutput complete!\n");
}
node *reverseRecursive(node *p, node *head)
{
node *temp ;
if(p->next == NULL)
{
head->next = p;
return p;
}
temp= reverseRecursive(p->next, head);
temp->next = p;
p->next=NULL;/*這里要個p的指針域賦予NULL*/
return p;
}
int main()
{
node *head = NULL;
head = createList();
printList(&head);
/*ReverseLink(head);*/
reverseRecursive(head->next, head);
printList(&head);
getch();
return 0;
}
④ 史上最全單鏈表的增刪改查反轉等操作匯總以及5種排序演算法(C語言)
史上最全單鏈表的增刪改查反轉等操作匯總以及5種排序演算法:
一、單鏈表的基本操作
創建鏈表
- 通過特定函數創建鏈表,並初始化頭節點和尾節點。
列印鏈表
- 使用循環遍歷鏈表,列印每個節點的值。
插入元素
- 頭部插入:在鏈表頭部插入新節點。
- 中間插入:在鏈表的指定位置插入新節點。
- 尾部插入:在鏈表尾部插入新節點。
刪除元素
- 根據節點值或位置刪除鏈表中的節點,需考慮頭尾節點的特殊情況。
查找元素
- 根據值在鏈表中進行查找,返回節點的位置或指針。
修改元素
- 根據位置修改鏈表中指定位置元素的值。
鏈表長度
- 計算鏈表的長度。
節點查找
- 查找指定位置的前驅節點和後繼節點。
二、鏈表反轉
- 調整鏈表結構,使鏈表元素逆序排列。
三、判斷鏈表是否有環
- 通過演算法檢測鏈表中是否存在環狀結構。
四、排序演算法
冒泡排序
- 重復遍歷鏈表,比較相鄰節點並交換值,直到鏈表有序。
選擇排序
- 每次從未排序部分選擇最小的節點,將其放到已排序部分的末尾。
插入排序
- 構建有序序列,對於未排序數據,在已排序序列中從後向前掃描,找到相應位置並插入。
歸並排序
- 將鏈表分成兩半,遞歸地對每半部分進行排序,然後將兩個有序鏈表合並成一個。
快速排序
- 選擇一個基準節點,將鏈表分成兩部分,小於基準的節點放在基準前面,大於基準的節點放在基準的後面,然後遞歸地對這兩部分排序。
以上內容涵蓋了單鏈表的基本操作以及五種常見的排序演算法,這些演算法在C語言中都有相應的實現方式。如需具體代碼實現,可參考相關數據結構教程或源碼庫。
