#include<stdlib.h>
#include<stdio.h>
//建立一个结构体链表:知识点1:typedef用法:http://blog.csdn.net/anton_6/article/details/6650726
typedef struct LineLink
{
int data;
struct LineLink *next;
}node;注意的地方:typedef struct LineLink node;
//严书中的方式:
- typedef struct LNode
- {
- ElemType data;
- struct LNode *next;
- }LNode,*LinkList;
//创建一个链表
node *Creat()
{
node *head,*p,*s;//建立一个头节点,一个遍历用的循环指针,一个临时节点
head=(node *)malloc(sizeof(node));//为头节点分配内存
p=head;//遍历循环指针指向头节点
int x,cycle=1;//输入数据x与链表建立控制参数cycle
while(cycle)
{
scanf("%d",&x);//输入数据
if(x)
{
s=(node*)malloc(sizeof(node));//建立临时节点
s->data=x;
p->next=s;//用上一个临时节点与此节点连接
p=p->next;//将遍历指针指向当前节点
}
else
cycle=0;
}
p->next=NULL;//遍历指针的结束指向空
return head;
}
注意:1.严书中链表结构体中建立了一个LineLink类型的普通变量和一个指针变量LineLink*,此处指建立一个普通变量,当要加指针的时候再定义,更简便。
2.遍历指针指向最后一个节点,最后一个节点的指针必须指向空。
//打印链表
void PRINT(node *p)
{
while(p->next!=NULL)
{ p=p->next;
printf(" %d ",p->data);
}
}
//算长度
int length(node *p)
{
int sum=0;p=p->next;//不计算头节点,从第一个节点开始计算。
while(p)
{
sum++;
p=p->next;
}
return sum;
}
//插入
void insertnode(node *link,int n,int data)
{
node *p, *s;
p=link;
int sum=length(link);
if(n<=0||n>sum+1)printf("error");
int i=0;
while(i<n-1)
{
p=p->next;i++;
}
s=(node *)malloc(sizeof(node));
s->data=data;
s->next=p->next;
p->next=s;
}
//注意:严书中定义插入 status ListInsert_L(LinkList &L,int i,ElemType e) LinkList 为Linelink*类型,我在此处改为
void insertnode(node *&link,int n,int data)程序正常运行,不知道具体道理是什么...C引用的问题...注意。
//删除
void deletenode(node *link,int n)
{
node *p=link;
int i=0;
int sum=length(link);
if(n<=0||n>sum)printf("error");
while(i<n-1)
{
i++;p=p->next;
}
node *q=p->next;
p->next=q->next;
free(q);
}
//注意一定要记得free;
//排序-选择排序
node *selectsort(node *link)
{
node *p,*q,*s;//三个指针一个记录交换节点,一个记录比较节点,一个记录最小节点
int i,j,data;//data用于数据交换
int n=length(link);求链表长度,当然可以用指针指空做遍历
for(i=0,p=link->next;i<n-1;i++,p=p->next)//p指向交换的节点
{
s=p;//s指向最小节点,开始把p作为最小
for(j=i+1,q=p->next;j<n;j++,q=q->next)//从p开始往后遍历找出最小的节点
if(s->data>q->data)s=q;//s指向最小节点
data=s->data;//进行数据交换。
s->data=p->data;
p->data=data;
}
return link;
}
//逆置
node *reverse(node *link)
{
node *p1,*p2,*p3;
p1=link->next;
p2=p1->next;
p1->next=NULL;//记得对第一个指针赋值为空,因为结束的时候为最后一个指针
while(p2)
{
p3=p2->next;//开始的时候这个地方总出错,错误原因是当p2为空之后,
p2->next=p1;//
p3等于p2的next内存引用错误***要记得
p1=p2;p2=p3;
}
link->next=p1;
return link;
}
//主函数
void main()
{
node *link=Creat();
PRINT(link);
insertnode(link,3,9);
printf(" \n%d ",length(link));
PRINT(link);
// printf("\n");
// deletenode(link,2);
// PRINT(link);
// node *l=selectsort(link);
//node *l=reverse(link);
// PRINT(l);
}