1. 程式人生 > >單鏈表實現大於第一個元素的節點在後,小於第一個節點的元素在前

單鏈表實現大於第一個元素的節點在後,小於第一個節點的元素在前

#include<stdio.h>
#include<iostream>
#define ERROR 0  
#define OK 1
typedef int ElemType;
typedef struct Node            //結構型別定義
{
	ElemType data;
	struct Node * next;
}Node, *Linklist;              /*Linklist為結構指標型別*/

void InitList(Linklist *L)           /*初始化單鏈表*/
{
	*L = (Linklist)malloc(sizeof(Node));          /*建立頭結點*/
	(*L)->next = NULL;                            /*建立空的單鏈表L*/
}

void CreateFromHead(Linklist L)          /*用頭插法建立單鏈表*/
{
	Node *s;
	char c;
	int flag = 1;
	while (flag)           /*flag初值為1,當輸入“#”時,置flag為0,建立表結束*/
	{
		c = getchar();
		if (c != '#')
		{
			s = (Node*)malloc(sizeof(Node));         /*建立新結點s*/
			s->data = c;
			s->next = L->next;            /*將s結點插入表頭*/
			L->next = s;
		}
		else flag = 0;
	}
}

int changgelist(Linklist L)
{
	Node *p1, *pre, *p, *q;
	if (L->next == NULL)
		return ERROR;
	p1 = L->next;          /*p1指向表中第一元素*/
	pre = p1;
	p = p1->next;
	
	/*順次從p開始取結點,比p1->data小的插在頭結點之後,比p1->data大的結點不作處理,繼續檢測其後續結點*/
	while (p)
	{
		q = p->next;
		if (p->data >= p1->data)
		{
			pre = p;
			p = q;
		}
		else
		{
			pre->next = p->next;
			p->next = L->next;
			L->next = p;
			p = q;
		}
	}
	
	return OK;
}
void main()
{
	Linklist l;
	Node *p;
	InitList(&l);
	printf("建立單鏈表,請輸入連結串列資料,以#結束!\n");
	CreateFromHead(l);
	p = l->next;
	printf("建立的單鏈表為:\n");
	while (p != NULL)
	{
		printf("%c ", p->data);
		p = p->next;
	}
	changgelist(l);
	p = l->next;
	printf("\n改變後的單鏈表為:\n");
	//printf("%c", p->data);
	p = l->next;
	while (p != NULL)
	{
		printf("%c ", p->data);
		p = p->next;
	}
	
}