#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);
}
線性表單鏈表算法分析(C語言)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.