您的位置:首页 > 其它

单链表的操作

2017-11-03 23:08 204 查看
/* 单链表的创建等等操作

日期:2017年11月3日 21:46

*/

#include "stdafx.h"

#include <iostream>

#include "stdlib.h"

using namespace std;

typedef struct node

{
int data;
node * next;

}node;

/* 

创建单链表

日期:2017年11月3日 21:46

*/

node * create()

{
int i = 0;
node *head, *p, *q=NULL;
int x = 0;
head = new node();

while (true)
{
printf("shu ru jie dian zhi");
scanf("%d", &x);
if (x==0)
{
break;
}
p = new node();
p->data = x;
if (++i == 1)
{
head->next = p;
}
else
{
q->next = p;
}
q = p;
}
q->next = NULL;
return head;

}

/*

测单链表长度

日期:2017年11月3日 21:53

*/

int Length(node * head)

{
int len = 0;
node *p;
p = head->next;
while (p != NULL)
{
len++;
p = p->next;
}
return len;

}

/*

单链表打印

日期:2017年11月3日 21:53

*/

int Print(node * head)

{
int index = 0;
node *p;
if (head->next == NULL)
{
printf("link is null\n");
return 0;
}
p = head->next;
while (p != NULL)
{
printf ("the %dth node is %d\n", ++index, p->data);
p = p->next;
}
return index;

}

/*

单链表查找(以节点数来查找,而不是以关键字来查找)

日期:2017年11月3日 21:58

*/

node * search(node*head, int pos)

{
node *p = head->next;
if (pos<0)
{
printf("incorrect position to search node!\n");
return NULL;
}
if (pos == 0)
{
return head;
}
if (p == NULL)
{
printf("link is empty!\n");
return NULL;
}
while (pos--)
{
if ((p=p->next)==NULL)
{
printf("incorrect position to search node!\n");
break;
}
}
return p;

}

/*

单链表插入节点

日期:2017年11月3日 22:10

*/

node *insert_node(node* head, int pos, int data)

{
node * item = NULL;
node *p;
item = new node();
item->data = data;
if (pos ==0)
{
head->next = item;
return head;
}
p = search(head, pos-1);

//在p 与p->next中插入节点item
//很简单  
if (p!=NULL)
{
item->next = p->next;
p->next = item;
}
return head;

}

/*

单链表删除节点

日期:2017年11月3日 22:10

*/

node *delete_node(node* head, int pos)

{
node * item = NULL;
node *p = head->next;

if (p == NULL)
{
printf("link is empty!\n");
return NULL;
}
p = search(head, pos-1);

if (p!=NULL&&p->next!=NULL)
{
item = p->next;
p->next = item->next;
delete item;
}
return head;

}

/*

单链表逆转

日期:2017年11月3日 22:10

*/

node * reverse(node * head)

{

node *p, *q, *r;
if (head->next == NULL)
{
return NULL;
}
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;

}

/*

查找单链表的中间元素

i走两步,j走一步……,由此来判断中间的元素

日期:2017年11月3日 22:10

*/

node * searchMidNode(node * head)

{
int i = 0;
int  j = 0;
node * current = NULL;
node * middle = NULL;

current = middle = head->next;
while (current!=NULL)
{
if (i/2>j)
{
j++;
middle = middle->next;
}
i++;
current = current->next;
}
return middle;

}

int main()

{
node *head = create();
printf("len:%d\n", Length(head));
head = insert_node(head, 2, 5);
printf("insert int 5 after 2th node :\n");

Print(head);
head = delete_node(head, 2);
printf("delete the 3th node :\n");
Print(head);

head = reverse(head);

Print(head);
node *middle = new node();
middle = searchMidNode(head);
printf("middle index:%d\n", middle->data);//t中间元素

system("pause");

    return 0;
}

运行结果 :
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: