单链表

来源:互联网 发布:15赛季nba总决赛数据 编辑:程序博客网 时间:2024/06/05 18:09

data.h

#include <stdio.h>#include <stdlib.h>#include <string.h>#ifndef _DATA_H_#define _DATA_H_typedef struct node{int data;struct node *next;}node;#endif

create.c

#include "data.h"node *create(){node *head;node *tail, *append_node;int i,n,data;head = (node *)malloc(sizeof(node));head->next = NULL;tail = head;printf("Input the number of the elements: ");scanf("%d",&n);for(i = 0; i < n; i++){append_node = (node *)malloc(sizeof(node));printf("Input the %dth data: ",i + 1);scanf("%d",&data);append_node->data = data;tail->next = append_node;tail = append_node;tail->next = NULL;}return head;}
show.c

#include "data.h" void show(node *head){if(head == NULL)return;node *p = head->next;while(p != NULL){printf("%d ",p->data);p = p->next;}printf("\n");}
find_mid.c

#include "data.h"node *find_mid(node *head){int i = 0;int j = 0;node *current = NULL;node *middle = NULL;current = head->next;middle = head->next;while (current != NULL){if (i / 2 > j){j++;middle = middle->next;}i++;current = current->next;}return middle;}
isLoop.c

#include "data.h"/* * 判断是否存在回环 * 如果存在,start存放回环开始的节点 * */#define IS_LOOP1#define NO_LOOP 0int isLoop(node *head, node **start){node *p1 = head;node *p2 = head;if (head == NULL || head->next == NULL)return NO_LOOP;do{p1 = p1->next;/* p1走一步 */p2 = p2->next->next;/* p2走二步 */}while (p2 && p2->next && p1 != p2);if (p1 == p2){*start = p1;/*p1(p2)为回环的开始节点 */return IS_LOOP;}elsereturn NO_LOOP;}
rever.c

#include "data.h"node *rever(node *head){node *p, *q, *r;/* 链表为空 */if (head->next == NULL)return head;p = head->next;q = p->next;/* 保存原来的第二个节点 */p->next = NULL; /* 原来第一个节点变为末节点 */while (q != NULL){r = q->next;q->next = p;p = q;q = r;}head->next = p; /* 新的头结点为原来的末节点 */return head;}
merge_recursive.c

#include "data.h"node *merge_recursive(node *head1, node *head2){node *merge_head = NULL;if (head1 == NULL)return head2;if (head2 == NULL)return head1;if (head1->data < head2->data){merge_head = head1;merge_head->next = merge_recursive(head1->next, head2);}else{merge_head = head2;merge_head->next = merge_recursive(head1, head2->next);}return merge_head;}
main.c

#include "data.h"extern node *create();extern void show();extern node *find_mid(node *head);extern node *rever(node *head);extern node *merge_recursive(node *head1, node *head2);extern int isLoop(node *head, node **start);int main(){#ifdef TEST_NORMALnode *head = NULL;node *mid = NULL;head = create();show(head);head = rever(head);show(head);mid = find_mid(head);printf("mid node is %d\n", mid->data);#endif#ifdef TEST_MERGEnode *head1 = NULL;node *head2 = NULL;node *merge_head = NULL;head1 = create();show(head1);head2 = create();show(head2);merge_head = merge_recursive(head1, head2);show(merge_head->next);#endif#ifdef TEST_LOOPnode *head = create();#ifdef MAKE_A_LOOPnode *start = head->next->next->next;/* 使第3个节点为回环的开始位置 */start->next = head->next;/* 回环连接到第一个节点 */#elsenode *start = NULL;#endifprintf("%s\n",isLoop(head, &start) == 1 ? "loop" : "no loop");#endifreturn 0;}


原创粉丝点击