单链表

#include<stdio.h>
#include<stdlib.h>
#define MaxSize 100
#define INSERTER 10
typedef struct Node
{
	int data;
	struct Node *next;
}SLNode ;

void ListIntiate(SLNode **head)  //指针的指针
{ 
	*head = (SLNode *)malloc(MaxSize*sizeof(SLNode));
	(*head)->next = NULL; // 记住括号不能少
}
int ListLength(SLNode *head)
//返回结点的个数,不算头结点
{
		SLNode *p;
		int size = -1;
		p = head;
		while (p!=NULL)
		{
			size++;
			p = p->next;
		}
		return size;
}
//void ListInsert(SLNode *head, int x)
//{
//	SLNode *s;
//	s = (SLNode *)malloc(sizeof(SLNode));
//	s->data = x;
//	s->next = head->next;
//	head->next = s;
//}
void ListInsert(SLNode *head,int i,int x)
//0<=i<=ListLength-2,相当数组的下标
{
	SLNode *s,*p=head;
	int j = -1;
	while (p->next!=NULL && j<i-1)
	{
		j++;
		p = p->next;
	}
	if (j != i-1)
	{
		printf("参数i有问题!\n");
	}
	s = (SLNode *)malloc(sizeof(SLNode));
	s->data = x;

	s->next = p->next;
	p->next = s;
}
void ListDelete(SLNode *head,int i,int *x)
//0<=i<=ListLength,相当数组的下标
{
	SLNode *p,*q; int j = -1;
	p = head;
	while ( p->next != NULL &&  p->next->next != NULL && j<i-1 )
	{
		j++;
		p = p->next;
	}
	if (j != i - 1)
	{
		printf("参数i有问题!\n");
	}
	*x = p->next->data;
	q = p->next;
	p->next = q->next;
	free(q);
}
void ListRemove(SLNode *head, int x)
{
	int i=0,n=0,flag=1;
	SLNode *p = head;
	while (flag != 0)
	{
		p = head;
		i = 0;
		while (p->next != NULL)
		{
			if (x == p->data)
			{
				ListDelete(head, i - 1, &n);
				break;
			}
			i++;
			p = p->next;
		}
		if (p->next == NULL)
		{
			flag = 0;
		}
	}
	if (x == p->data)//最后一个节点中的数据与x相等
	{
		p = head;
		while (p->next->next != NULL)
		{
			p = p->next;
		}
		p->next = NULL;
	}
}
void ListSort(SLNode *head) //就地排序不开辟新的内存
{
	SLNode *curr, *pre, *p, *q;
	p = head->next; 
	head->next = NULL;
	while (p != NULL)
	{
		curr = head->next;
		pre = head;
		while (curr != NULL && curr->data <= p->data)
		{
			pre = curr;
			curr = curr->next;
		}
		q = p;    //指针q指向待插入的的结点
		p = p->next;   
		q->next = pre->next; //将结点q插入到结点pre之后
		pre->next = q;
	}
}
void print(SLNode *head)
{
	SLNode *p;
	p = head->next;
	while (p != NULL)
	{
		printf("%d ", p->data);
		p = p->next;
	}
}
void Destory(SLNode **head)
//销毁单链表中所有的结点
{
	SLNode *p1,*p;
	p = *head;
	while (p!=NULL)
	{
		p1 = p;
		p = p->next;
		free(p1);
	}
	*head = NULL; //为了避免出现野指针
}
int main()
{
	SLNode *list; int n=0,i=0;
	ListIntiate(&list);
	for (i = 0; i < 10; i++)
	{
		ListInsert(list, i,9-i);
	}
	//for (i = 0; i < 10; i++)
	//{
	//	ListInsert(list, i+10, i);
	//}
	printf("原始数据:\n");
	print(list);
	printf("\n");
	printf("在第10个位置插入100:\n");
	ListInsert(list, 10, 100);
	print(list);
	printf("\n");
	printf("从小到大排序:\n");
	ListSort(list);
	print(list);
	printf("\n");
	printf(" 删除数字9:\n");
	//ListDelete(list,9, &n);
	ListRemove(list,9);
	print(list);
	printf("\n链表的长度 : %d \n",ListLength(list));

	Destory(&list);
	system("pause");
	return 0;
}


本文出自 “单链表” 博客,谢绝转载!

你可能感兴趣的:(单链表)