//...........C建立单链表
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
typedef struct student
{
int data;
struct student *next;
}Node;
Node *Creat()
{
Node *head,*p,*s;
int x,cycle = 1;
head = (Node*) malloc(sizeof(Node));
p = head;
//尾插法建立带表头的单链表
while(cycle)
{
printf("/ninput the data: ");
scanf("%d",&x);
if (x!=0)
{
s = (Node*)malloc(sizeof(Node));
s->data = x;
//printf("/n %d",s->data);
p->next = s;
p = s;
}
else
{
cycle = 0;
}
}
//head = head->next;
p->next = NULL;
//printf("/n %d",head->data);
return (head);
}
//..........测链表的长度
int Length(Node* head)
{
//Node *p = head->next;
//int count = 1;
Node *p = head;
int count = 0;
while(p!=NULL)
{
p = p->next;
count++;
}
return count;
}
//....打印单链表
void Print(Node *head)
{
Node *p = head->next;
//Node *p = head;
int len;
len = Length(p);
cout << "the length of list is: " << len <<endl;
while (p!=NULL)
{
cout << p->data << "," ;
p = p->next;
}
cout << endl;
}
//...查找第i个结点
Node *GetNode(Node *head,int i)
{
int iCount = 0;
Node *p = head;
while (p->next!=NULL && iCount<i)
{
p = p->next;
iCount++;
}
if (i == iCount)
{
return p;
}
else
{
return NULL;//在表中没有找到第i个结点
}
}
//按值查找结点
/*Node *GetNode(Node *head,int dKey)
{
Node *p = head->next;
while (p!=NULL && p->data!=dKey)
{
p = p->next;
}
return p;
}*/
//...删除第i个结点
Node *Delete(Node *head ,int i)
{
Node *p = GetNode(head,i-1);
Node *q = p->next;
if (NULL==p || NULL==q)
{
cout << "empty list and empty node are not deleted./n";
}
else
{
p->next = q->next;
free(q);
}
return head;
}
//...删除值为num的结点
/*Node *Delete(Node *head ,int num)
{
Node *p = head;
Node *q;
//查找制定结点//
while ((num!=p->data)&&(p->next!=NULL))
{
q = p;
p = p->next;
}
if (num == p->data)
{
/*if(p==head)
{
head = p->next;
}
else
{
q->next = p->next;
}*/
/* q->next = p->next;
free(p);
}
return head;
}*/
//....在第i个结点前插入值为iData的结点
Node *Insert(Node *head,int iData,int i)
{
Node *p = GetNode(head,i-1);
Node *q = (Node*) malloc (sizeof(Node));
int len = Length(head);
if (NULL==p)
{
cout << "not found the node in the list./n";
}
q->data = iData;//包括第一个结点(即开始结点head->next)之前,中间和表尾插入结点
q->next = p->next;
p->next = q;
return head;
}
//....... 单链表的结点按节点值由小到大顺次排列,插入结点
/*Node *Insert(Node *head,int num)
{
Node *p = (Node*) malloc(sizeof(Node));
Node *q = head;
Node *r;
p->data = num;
//查找制定结点//
while (p->data>q->data && q->next!=NULL)
{
r = q;
q = q->next;
}
if (p->data <= q->data)
{
if (head == q)
{
p->next = q;
head = p;
}
else
{
p->next = q;
r->next = p;
}
}
else
{
p->next = NULL;
q->next = p;
}
return head;
}*/
//...单链表的逆置
Node *Reverse(Node *head)
{
Node *p = head;
Node *q = p->next;
Node *r;
if (NULL==head || NULL==q)
{
cout << "empty list空表./n";
return head;
}
while (p!=NULL &&q!=NULL)
{
r = q->next;
q->next = p;
p = q;
q = r;
}
head->next = NULL;
// head->data = NULL;
head = p;
return head;
}
int main()
{
Node *pL;
cout << "first creat a list" << endl;
pL = Creat();
Print(pL);
Node *pD;
cout << "delete a node:/n ";
pD = Delete(pL,5);
Print(pD);
Node *pI;
cout << "insert a node in the list where data of node is increasing: " <<endl;
//r = Insert(p,4);
pI = Insert(pL,10,1);
Print(pI);
Node *pR;
cout << "reverse the list:/n";
pR = Reverse(pL);
Print(pR);//因为print从head->next开始输出,所以第一个数不能输出
return 0;
}