線性表單鏈表算法分析(C語言)

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

#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -2

typedef int ElemType;
typedef int Status;

/*存儲結構*/
typedef struct LNode 
{
	ElemType data;
	struct LNode *next;
}LNode,*LinkList;

/*頭插法建表*/
void CreateListF(LinkList *L,ElemType a[],int n) 
{
	LinkList s;
	int i;
	*L = (LinkList)malloc(sizeof(LNode));
	(*L)->next = NULL;
	for (int i = 0; i < n;i++) {
		s = (LinkList)malloc(sizeof(LNode));
		s->data = a[i];
		s->next = (*L)->next;         //將s插入開始節點之前,頭結點之後
		(*L)->next = s;
	}
}

/*尾插法建表*/
void CreateListR(LinkList *L,ElemType a[],int n) 
{
	LinkList s, r;
	int i;
	(*L) = (LinkList)malloc(sizeof(LNode));//創建頭結點
	r = (*L);                             //r開始時指向頭節點
	for (i = 0; i < n;i++) {             //循環建立數據節點
		s = (LinkList)malloc(sizeof(LNode));  //創建數據節點s
		s->data = a[i];                   //將s插入r之後
		r->next = s;
		r = s;
	}
	r->next = NULL;                      //爲節點next域置爲NULL
}

/*刪除單鏈表元素最大的節點,假設節點唯一*/
void delmaxnode(LinkList *L) 
{
	LinkList p = (*L)->next, pre = (*L), maxp = p, maxpre = pre;
	while (p) {
		if (maxp->data<p->data) {       //若找到一個更大的節點
			maxp = p;
			maxpre = pre;
		}
		pre = p;                        //p,pre同步後移一個節點
		p = p->next;
	}
	maxpre->next = maxp->next;
	free(maxp);
}

/*使元素遞增有序排列*/
void sort(LinkList *L) 
{
	LinkList p, pre, q;
	p = (*L)->next->next;//p指向第二個節點
	(*L)->next->next = NULL;//構造只含有一個節點的鏈表(一個節點是有序的)
	while (p) {
		q = p->next;//q指向p的後繼節點
		pre = *L;
		while (pre->next&&pre->next->data<p->data) {
			pre = pre->next;
		}
		p->next = pre->next;
		pre->next = p;
		p = q;
	}
}

/*所有節點逆置*/
void Rerverse(LinkList *L) 
{
	LinkList p = (*L)->next, q;
	(*L)->next = NULL;
	while (p) {
		q = p->next;
		p->next = (*L)->next;
		(*L)->next = p;
		p = q;
	}
}

/*分解split,L1尾插法,L2頭插法*/
void split(LinkList *L,LinkList *L1,LinkList *L2) 
{
	LinkList p = (*L)->next, q, r1;
	*L1 = *L;
	r1 = *L1;
	*L2 = (LinkList)malloc(sizeof(LNode));
	(*L2)->next = NULL;
	while (p) {
		r1->next = p;
		r1 = p;
		p = p->next;
		q = p->next;;
		p->next = (*L2)->next;
		(*L2)->next = p;
		p = q;
	}

}

void visit(ElemType e) 
{
	printf("%d",e);
}

void TraverseList(LinkList L,void (*visit)(ElemType)) 
{
	LinkList p = L->next;
	while (p) {
		visit(p->data);
		p = p->next;
	}
}

int main() 
{
	LinkList L,R;
	ElemType a[] = {1,2,3,4,5};
	CreateListF(&L,a,5);
	CreateListR(&R,a,5);
	TraverseList(L, visit);
	printf("\n");
	delmaxnode(&L);
	TraverseList(L, visit);
	printf("\n");
	TraverseList(R,visit);

}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章