《程序员面试宝典》读书笔记之单链表和源码

#include <stdio.h>
#include <stdlib.h>

typedef struct Node
{
	int data;
	struct Node* next;
}Node;

/*输出:头结点的指针*/
Node *Create()
{
	Node *head;
	Node *p;
	Node *s;
	int x;
	int cycle = 1;

//	printf("sizeof(Node) = %d\n", sizeof(Node));
	head = (Node *)malloc(sizeof(Node));

	p = head;

	while(cycle)
	{
		scanf("%d", &x);
		if (0 != x)							//输入数据是0作为结束标志
		{
			s = (Node *)malloc(sizeof(Node));
			s->data = x;
			p->next = s;
			p = s;
		}
		else
		{
			cycle = 0;
		}
	}

	//head = head->next;					//面试宝典返回的是第一个结点的指针,觉得不合理
	s->next = NULL;

	return head;
}

/*测表长*/
int SqListLength(Node *sql)
{
	int length = 0;
	Node *tem = sql->next;

	while(tem != NULL)
	{
		++length;
		tem = tem->next;
	}

	return length;
	
}

/*打印线性表*/
void PrintSqList(Node *sq)
{
	Node *tem = sq->next;
	
	while(tem != NULL)
	{
		printf("sq->data = %d\n", tem->data);
		tem = tem->next;
	}
}

/*删除结点*/
Node *DeleteNode(Node *sq, int num)
{
	Node *tem = sq->next;
	Node *fore = sq;

	while (tem != NULL && tem->data != num)	//查找值为num的结点
	{
		fore = tem;
		tem = tem->next;
		//printf("find it\n");
	}

	if (tem->data == num)
	{
		fore->next = tem->next;		//此句话是关键!!!!
		free(tem);
		printf("delete it\n");
	}
	else
	{
		printf("Can't find that node!\n");
	}

	return sq;
}

Node *InsertNode(Node *sq, int num)
{
	Node *tem = sq->next;
	Node *fore = sq; 

	Node *newNode = (Node *)malloc(sizeof(Node));
	newNode->data = num;

	while (tem != NULL && tem->data < num)	//顺序插入,找到合适的位置。
	{
		fore = tem;
		tem = tem->next;
		printf("find it\n");
	}

	fore->next = newNode;
	newNode->next = tem;

/*
	if (tem != NULL)
	{
		fore->next = newNode;
		newNode->next = tem;
	}
	else
	{
		
		printf("insert failure\n");
	}*/

	return sq;
	
}

/*
void BubbleSort(int arr[],int len)
{
	int i;
	int j;
	for (i = 1; i < len; i++)
	{
		for (j = 0; j < len - i; j++)  //排好顺序的元素在数组的后面
		{
			if (arr[j] > arr[j + 1])
			{
				int tem = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tem;
			}
		}
	}
}

void PrintArr(int arr[], int len)
{
	printf("After sorting:\n");

	for (int index = 0; index < len; index++)
	{
		printf("%d\n",arr[index]);
	}
}*/

/*线性表排序*/
Node *SortSq(Node *sq)
{
	Node *p; 
	int length = SqListLength(sq);

	if (length == 0 || length == 1)
	{
		return sq;
	}
	else
	{
		for (int i = 1; i < length; i++)
		{
			p = sq->next;

			for (int j = 0; j < length - i; j++)
			{
				if (p->data > p->next->data)		//不交换结点,只交换结点中的数据
				{
					int tem = p->data;
					p->data = p->next->data;
					p->next->data = tem;
				}

				p = p->next;
			}
		}

		return sq;
	}
}
int main()
{
/*
	int arr[] = {1, 3, 2, 4};
	BubbleSort(arr, 4);
	
	PrintArr(arr,4);*/


	Node *sq = Create();
	printf("len = %d\n", SqListLength(sq));
	PrintSqList(sq);

	printf("\n");

	sq = SortSq(sq);
	PrintSqList(sq);
/*
	sq = DeleteNode(sq, 2);
	PrintSqList(sq);

	printf("\n");

	sq = InsertNode(sq, 8);
	PrintSqList(sq);
	
	printf("\n");*/


	return 0;
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值