網站首頁 編程語言 正文
交換單鏈表第n和n+1個鏈點
帶頭結點的單鏈表,頭指針為h,編寫算法,實現單鏈表中第n個結點和第n+1個結點相互交換,如果n為尾結點,需要向用戶輸出提示信息,代表交換失敗,返回0,若交換成功返回1,并打印交換后的單鏈表。
這個題主要難點 :
1.判斷是否滿足有n+1個節點。
2. 交換這倆個節點的位置
該單鏈表的存儲結構
typedef int DataType;
typedef struct Node
{
DataType data; // data域用于存儲數據元素
struct Node *next; // next域用于存放指向其后繼的指針
}LNode, *PNode, *LinkList; // LinkList為頭指針
// **初始化函數**
int InitLinkList(LinkList *head)
{
*head = (LinkList)malloc(sizeof(LNode));
if (!head)
{
printf("初始化鏈表錯誤!\n");
return 0;
}
(*head)->next = NULL;
return 1;
}
// **求鏈表長度函數**
int LinkListLength(LinkList head)
{
int length = 0;
PNode p = head->next;
while (p)
{
length++;
p = p->next;
}
return length;
}
//**判斷鏈表是否為空函數**
int LinkListEmpty(LinkList head){
if (head->next) {
return 0;
}
else {
return 1;
}
}
//**插入函數**
int LinkListInsert(LinkList h, int pos, DataType x)
{
PNode p = h, q;
int i = 0;
while (p && i < pos- 1)
{
p = p->next;
i++;
}
if (!p || i > pos - 1)
{
printf("插入位置不合法!\n");
return 0;
}
q = (PNode)malloc(sizeof(LNode));
if (!q)
{
printf("不能生成新結點\n");
return 0;
}
q->data = x;
q->next = p->next;
p->next = q;
return 1;
}
// **摧毀鏈表函數**
void DestroyLinkList(LinkList h)
{
PNode p = h->next;
while (h)
{
p = h;
h = h->next;
free(p);
}
}
//**遍歷鏈表函數**
void TraverseLinkList(LinkList h)
{
PNode p = h->next;
while (p)
{
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
// **用于和下面語句一起判斷交換是否成功**
// 其實這個函數可以不用直接在主函數中判斷即可
PNode findN(LinkList a,int n)
{
int cnt = 1;
PNode p = a;
while( p && cnt <= n )
p = p->next;
cnt++;
return p;
}
// **交換鏈點位置函數**
int SwapN_inList( LinkList a , int posN , int *len)
{
LinkList A , q,p;
int n =1, num =0;
A=a->next;
while(A) // 統計節點個數
{
num++;
A = A->next;
}
*len = num;
if(posN >= num) // 判斷是否滿足有n+1個節點
{
return 0;
}
A = a->next;
while(1)
{ // 找到待交換節點
if(n == posN-1)
{
q = A->next; //第n個節點
p = q->next; // 表示第n+1個節點
A->next = q->next;
q->next = p->next;
p->next = q;
break;
}
n++;
A = A->next;
}
return 1;
}
// **主函數**
int main()
{
LinkList h;
char ch;
PNode s1=NULL,s2=NULL,s3=NULL,s4=NULL;
DataType x,N;
int length = 0, pos = 1;
InitLinkList(&h);
do
{
scanf("%d",&x);
LinkListInsert( h , pos++ , x );
}while((ch=getchar())!='\n');
scanf("%d",&N);
s1 = findN(h,N);
if (s1)
{
s2 = s1->next;
}
if ( SwapN_inList( h , N , &length) == 1 )
{
s3 = findN(h,N);
if (s3)
{
s4 = findN(h,N+1);
}
if ( s1 == s4 && s2 == s3 )
{
printf("交換第%d個和第%d個鏈點位置后的單鏈表A是\n", N , N+1 );
TraverseLinkList( h );
}
}
else
{
printf("單鏈表A的第%d個結點為尾結點,沒有下一個結點與之交換\n", length);
}
DestroyLinkList( h );
return 0;
}
原文鏈接:https://blog.csdn.net/smallcabbage12/article/details/125698661
- 上一篇:求兩個降序單鏈表的并集(利用原有鏈點)
- 下一篇:數據結構之冒泡排序
相關推薦
- 2022-05-10 ASP.NET?Core使用Log4net實現日志記錄功能_實用技巧
- 2022-12-05 TensorFlow中關于tf.app.flags命令行參數解析模塊_python
- 2022-09-27 golang?防緩存擊穿singleflight的實現_Golang
- 2022-04-25 .NET避免裝箱的方法_實用技巧
- 2022-04-10 微服務架構之服務注冊與發現實踐示例詳解_服務器其它
- 2022-07-19 Android通過交互實現貝塞爾曲線的繪制_Android
- 2022-06-06 typescript類型別名、限制值的大小
- 2022-11-25 PostgreSQL自增主鍵用法及在mybatis中的使用教程_PostgreSQL
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支