C语言链表的实现(修改版)Cpp文件

// LinkList.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include "LinkList.h"
#include <malloc.h>

int _tmain(int argc, _TCHAR* argv[])
{
 LinkList list;
 InitList(list);
 printf("初始化链表长度:%d/n",list.len);

 for(int i = 0 ;i < 3; i++)
 {
  Link link;
  ElemType e;
  e.Element = i+10;
  MakeNode(link,e);
  printf("节点数据域:%d/n",link->data.Element);

  InsFirst(list,link);
  printf("添加节点后链表长度:%d/n",list.len);
 }

 /*DelFirst(list,link);
 printf("删除节点后链表长度:%d/n",list.len);*/

 Link p;
 Status x = LocatePos(list,p,2);
 printf("可否定位到第%d个节点:%d/n",2,x);
 free(p);

 ElemType e;
 e.Element = 11;
 p = LocateElem(list,e);
 printf("是否包含元素E:%d/n",p->data);

 x = IsEmpty(list);
 printf("删除节点后链表是否为空:%d/n",x);

 x = ListTraverse(list);
 printf("遍历链表成功:%d/n",x);
 return 0;
}

//分配一个p指向的值为e的节点,并返回OK;如果分配失败,则error
Status MakeNode( Link &p, ElemType e){
 p = ( Link)malloc(sizeof(LNode));
 if( !p) return ERROR;
    p->data = e;
 p->next = NULL;
 return OK;
}//The end of MakeNode

//释放p指向的节点
Status FreeLNode( Link &p){
 if( !p) return ERROR;//Space does not exist
 free( &p);
 return OK;
}//end of FreeLNode

 

//初始化一个已经声明链表L
Status InitList( LinkList &L){
 L.head = L.tail = NULL;
 L.len = 0;
 return OK;
}


//在头节点位置插入一个新的节点,h指向头,s指向新的节点
Status InsFirst( LinkList &L, Link s){
 if(!s)
  return ERROR;
 s->next = L.head;
 L.head = s;
 L.len += 1;
 return OK;
}

//将头节点删除
Status DelFirst( LinkList &h, Link &q){
 if(!h.head)
  return ERROR;
 q = h.head;
 h.head = q->next;
 free(q);
 h.len -= 1;
 return OK;
}

 


//判断当前链表是否空表,以true和false返回结果
Status IsEmpty( LinkList L){
 if(L.len == 0)
  return OK;
 else
  return ERROR;
}

//返回链表当中头节点的位置
Position GetHead( LinkList L){
 return L.head;
}

//返回链表当中最后一个节点的位置
Position GetLast( LinkList L){
 return L.tail;
}

//由当前p指向的位置,查找p的邻接前一个节点的位置
Position PriorPos( LinkList L, Link p){
 Link q ;
 q = L.head;
 while(q->next != p){
  q = q->next;
 }
 return q;
}

//由当前p指向的位置,查找p的下一个邻接元素的位置
Position NextPos( LinkList L, Link p){
 return p->next;
}

//获取当前链表内第i个元素的位置,如果i不存在,则ERROR
Status LocatePos( LinkList L, Link &p, int i){
 if(!L.head)
  return ERROR;
 p = L.head; 
 for(int j = 0; j < i;j ++ )
 {
  p = p->next;
  if(!p)
   return ERROR;
 }
 return OK;
}
//查找当前链表当中与给定内容e相符的第一个元素的位置,找不到则返回Error
Position  LocateElem( LinkList L, ElemType e){
 if(!L.head)
  return NULL;
 Link p = L.head ;
 while(p){
  if(p->data.Element == e.Element)
   return p;
  p = p->next;
 }
 return p;
}
//遍历整个链表,如果遍历失败,则返回falsh
Status ListTraverse( LinkList L){
 Link p = L.head;
 for(int i = 0;i < L.len; i++){
        p = p->next;
  if(!p && i != L.len-1)
   return ERROR;
 }
 return OK;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
循环链表是一种链表的变体,它的最后一个节点指向第一个节点,形成一个闭环。在C语言中,可以使用循环链表实现约瑟夫环。循环链表的创建与操作步骤如下所示: 1. 定义循环链表的节点结构体,包含数据域和指向下一个节点的指针。 2. 创建一个头节点,并将其指针指向自身,表示链表为空。 3. 根据输入的数据创建其他节点,并通过指针连接起来形成循环链表。 4. 遍历链表,找到要删除的节点,并将其前一个节点的指针指向下一个节点。 5. 重复以上步骤,直到链表中只剩下一个节点。 下面是使用循环链表实现约瑟夫环的C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义循环链表的节点结构体 typedef struct Node { int data; struct Node* next; } Node; // 创建循环链表 Node* createCircularLinkedList(int n) { if (n <= 0) { return NULL; } Node* head = (Node*)malloc(sizeof(Node)); head->data = 1; head->next = NULL; Node* prev = head; for (int i = 2; i <= n; i++) { Node* newNode = (Node*)malloc(sizeof(Node)); newNode->data = i; newNode->next = NULL; prev->next = newNode; prev = newNode; } prev->next = head; // 最后一个节点指向头节点,形成循环 return head; } // 删除节点,并返回下一个节点 Node* deleteNode(Node* node) { Node* nextNode = node->next; node->next = nextNode->next; free(nextNode); return node->next; } // 约瑟夫环问题的求解 void josephusProblem(int n, int m) { Node* head = createCircularLinkedList(n); Node* current = head; while (current->next != current) { for (int i = 1; i < m - 1; i++) { current = current->next; } current = deleteNode(current); } printf("最后剩下的节点: %d\n", current->data); free(current); } int main() { int n = 10; // 节点个数 int m = 3; // 每次删除的间隔 josephusProblem(n, m); return 0; } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值