【程序员面试宝典】数据结构基础一单链表:创建|求长|插入|删除|排序|打印|逆置

#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;
//严书中的方式:

  
  
  1. typedef struct LNode  
  2. {  
  3.     ElemType data;  
  4.     struct LNode *next;  
  5. }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); }



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值