单链表的操作
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;
}
运行结果 :
日期: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;
}
运行结果 :