#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef int ElemenType;
typedef struct
{
ElemenType data[MaxSize];
int length;
}SqList;
void CreateList(SqList* &L, ElemenType a[], int n)
{
int i;
L = (SqList*)malloc(sizeof(SqList));
for (i = 0; i < n; i++)
L->data[i] = a[i];
L->length = n;
}
void InitList(SqList* &L)
{
L = (SqList*)malloc(sizeof(SqList));
L->length = 0;
}
void DestroyList(SqList* &L)
{
free(L);
}
bool ListEmpty(SqList* &L)
{
return (L->length == 0);
}
int ListLength(SqList* &L)
{
return L->length;
}
void DispList(SqList* &L)
{
int i;
if (ListEmpty(L))
return;
for (i = 0; i < L->length; i++)
printf("%d\n", L->data[i]);
printf("\n");
}
ElemenType e;
bool GetElem(SqList* &L, int i, ElemenType& e)
{
if (i < 1 || i > L->length)
return false;
e = L->data[i - 1];
return true;
}
int LocateElem(SqList*L, ElemenType e)
{
int i = 0;
while (i < L->length && L->data[i] != e)
i++;
if (i >= L->length)
return 0;
else
return i + 1;
}
bool ListInsert(SqList* &L, int i, ElemenType e)
{
int j;
if (i<1 || i > L->length + 1)
return false;
i--;
for (j = L->length;j > i;j--)
L->data[j] = L->data[j - 1];
L->data[i] = e;
L->length++;
return true;
}
bool ListDelete(SqList* &L, int i, ElemenType& e)
{
int j;
if (i<1 || i > L->length)
return false;
i--;
e = L->data[i];
for (j = i;j < L->length-1;j++)
L->data[j] = L->data[j + 1];
L->length--;
return true;
}
void Delnode1(SqList* &L, ElemenType x)
{
int i;
ElemenType e;
while ((i = LocateElem(L, x)) > 0)
{
ListDelete(L, i, e);
}
}
void Delnode2(SqList* &L, ElemenType x)
{
int k = 0;
for (int i = 0; i < L->length;i++)
{
if (L->data[i] != x)
{
L->data[k] = L->data[i];
k++;
}
}
L->length = k;
}
int main()
{
SqList* sq;
InitList(sq);
ElemenType x[6] = { 2,8,7,2,4,2 };
CreateList(sq, x, 6);
DispList(sq);
ListInsert(sq,7,100);
DispList(sq);
ElemenType y;
ListDelete(sq, 3, y);
printf("%d\n",LocateElem(sq, y));
DispList(sq);
printf("%d\n", y);
ListInsert(sq, 7, 200);
ListInsert(sq, 8, 300);
DispList(sq);
Delnode1(sq, 2);
DispList(sq);
return 0;
}
#include <stdio.h>
#include <stdlib.h>
#define MaxSize 50
typedef int ElemenType;
//线性表
typedef struct
{
ElemenType data[MaxSize];
int length;
}SqList;
//城市表 区号
//建立顺序表
void CreateList(SqList* &L, ElemenType a[], int n) //这里是对指针的引用,传递进来的是指针,如果形参为指针,那无法赋值为指针
{
int i;
L = (SqList*)malloc(sizeof(SqList)); //new
for (i = 0; i < n; i++)
L->data[i] = a[i];
L->length = n;
}
//初始化线性表InitList(L)
void InitList(SqList* &L)
{
L = (SqList*)malloc(sizeof(SqList));
L->length = 0;
}
//销毁线性表
void DestroyList(SqList* &L)
{
free(L);
}
//判空
bool ListEmpty(SqList* &L)
{
return (L->length == 0);
}
//求长度
int ListLength(SqList* &L)
{
return L->length;
}
//输出线性表
void DispList(SqList* &L)
{
int i;
if (ListEmpty(L))
return;
for (i = 0; i < L->length; i++)
printf("%d\n", L->data[i]);
printf("\n");
}
//求某个位置上数据元素
ElemenType e;
bool GetElem(SqList* &L, int i, ElemenType& e)
{
if (i < 1 || i > L->length)
return false;
e = L->data[i - 1];
return true;
}
//按元素值查找,是否出现,并返回位置
int LocateElem(SqList*L, ElemenType e)
{
int i = 0;
while (i < L->length && L->data[i] != e)
i++;
if (i >= L->length)
return 0;
else
return i + 1;
}
//插入,在某个位置上插入e,后面位置必须后移,最后长度+1
bool ListInsert(SqList* &L, int i, ElemenType e)
{
int j;
if (i<1 || i > L->length + 1)
return false;
i
for (j = L->length;j > i;j
L->data[j] = L->data[j - 1];
L->data[i] = e;
L->length++;
return true;
}
//删除某个元素
bool ListDelete(SqList* &L, int i, ElemenType& e)
{
int j;
if (i<1 || i > L->length)
return false;
i
e = L->data[i];
for (j = i;j < L->length-1;j++)
L->data[j] = L->data[j + 1];
L->length
return true;
}
//将线性表中所有某个元素全部删除,方法1
void Delnode1(SqList* &L, ElemenType x)
{
int i;
ElemenType e;//删除的元素保存出来
while ((i = LocateElem(L, x)) > 0)
{
ListDelete(L, i, e);
}
}
//复杂度为O(n平方)
//////方法2,减小复杂度
void Delnode2(SqList* &L, ElemenType x)
{
int k = 0;//k记录非x 的元素个数
for (int i = 0; i < L->length;i++)
{
if (L->data[i] != x)
{
L->data[k] = L->data[i];
k++;
}
}
L->length = k;
}
//分离元素,以第一个元素为分界线,将所有小于它的元素移到该元素的前面,将所有大于它的元素移到该元素的后面
//解法1:
//以data[0]为基准。
//从区间两端交替向中间扫描,直到 i=j ,每轮循环
// 从右到左,找一个小于等于pivot的元素
// 从左到右,找一个大于pivot的元素
// 然后将L->data[i] 和 L->data[j]交换
//退出循环,将L->data[0]和L->data[j]交换
void move1(SqList* &L)
{
int i = 0, j = L->length - 1;
ElemenType pivot = L->data[0];
ElemenType tmp;
while (i < j)
{
//从右到左,找到第一个小于pivot的元素
while (i < j && L->data[j] > pivot)
j
//从左到右,找到第一个大于pivot的元素
while (i < j && L->data[i] <= pivot)
i++;
//交换
if (i < j)
{
tmp = L->data[i];
L->data[i] = L->data[j];
L->data[j] = tmp;
}
}
//退出循环,将L->data[0]和data[j]交换
tmp = L->data[0];
L->data[0] = L->data[j];
L->data[j] = tmp;
}
//方法2,交替进行,一次左一次右,直接将数据互换
void move2(SqList* &L)
{
int i = 0, j = L->length - 1;
ElemenType pivot = L->data[0];
while (i < j)
{
while (i < j && L->data[j] > pivot)
j
L->data[i] = L->data[j];
i++;
while (i < j && L->data[i] < pivot)
i++;
L->data[j] = L->data[i];
j
}
L->data[i] = pivot;
printf("i = %d \n",i);
}
int main()
{
SqList* sq; //野指针
InitList(sq);
ElemenType x[10] = { 3,8,2,7,1,5,3,4,6,0 };
CreateList(sq, x, 10);
DispList(sq);
printf("\n");
move1(sq);
DispList(sq);
/////////////////////////
SqList* sq2; //野指针
InitList(sq2);
ElemenType y[10] = { 3,8,2,7,1,5,3,4,6,0 };
CreateList(sq2, y, 10);
DispList(sq2);
printf("\n");
move2(sq2);
DispList(sq2);
system("pause");
return 0;
}
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
char code[4];
char name[16];
char description[32];
}ElemType;
typedef struct LNode
{
ElemType data;
struct LNode* next ;
}LinkList;
void CreateListF(LinkList* &L,ElemType a[],int n)
{
LinkList* s;
int i;
L = (LinkList*)malloc(sizeof(LinkList));
L->next = NULL;
for (i = 0; i < n; i++)
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = a[i];
s->next = L->next;
L->next = s;
}
}
void CreateListR(LinkList* &L, ElemType a[], int n)
{
LinkList* s;
LinkList* r;
int i;
L = (LinkList*)malloc(sizeof(LinkList));
r = L;
for (i = 0; i < n; i++)
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = a[i];
r->next = s;
r = s;
}
r->next = NULL;
}
void DestroyList(LinkList* &L)
{
LinkList *pre = L, *p = L->next;
while (p != NULL)
{
free(pre);
pre = p;
p = pre->next;
}
free(pre);
}
bool ListEmpty(LinkList* &L)
{
return(L->next == NULL);
}
int ListLength(LinkList* &L)
{
int n = 0;
LinkList *p = L;
while (p->next != NULL)
{
n++;
p = p->next;
}
return n;
}
void DispList(LinkList* &L)
{
LinkList *p = L->next;
while (p != NULL)
{
printf("data is %s\n", p->data.code);
p = p->next;
}
printf("_____\n");
}
bool GetElem(LinkList* &L, int i,ElemType& e)
{
int j = 0;
LinkList *p = L;
while (j < i && p != NULL)
{
j++;
p = p->next;
}
if (p != NULL)
return false;
else
{
e = p->data;
return true;
}
}
int LocateElem(LinkList* &L, char e[])
{
int i = 1;
LinkList *p = L->next;
while (p != NULL && ((p->data.code) != e))
{
p = p->next;
i++;
}
if (p == NULL)
return 0;
else
return i;
}
bool ListInsert(LinkList* &L, int i, ElemType e)
{
int j = 0;
LinkList *p = L, *s;
while (j < i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return false;
else
{
s = (LinkList*)malloc(sizeof(LinkList));
s->data = e;
s->next = p->next;
p->next = s;
return true;
}
}
bool ListDelete(LinkList* &L, int i, ElemType &e)
{
int j = 0;
LinkList* p = L, *q;
while (j < i - 1 && p != NULL)
{
j++;
p = p->next;
}
if (p == NULL)
return false;
else
{
q = p->next;
if (q == NULL)
return false;
e = q->data;
p->next = q->next;
free(q);
return true;
}
}
int main()
{
ElemType a[3] = { {"001","beijing","BJ"},{"021","shanghai","SH"},{"086","china","CH"} };
LinkList *p,*q;
CreateListF(p, a, 3);
DispList(p);
CreateListR(q, a, 3);
DispList(q);
system("pause");
return 0;
}
- 单链表 – 拆分

void split(LinkList* &L, LinkList* &L1, LinkList* &L2)
{
LinkList *p = L->next, *q, *r1;
L1 = L;
r1 = L1;
L2 = (LinkList*)malloc(sizeof(LinkList));
L2->next = NULL;
while (p != NULL)
{
r1->next = p;
r1 = p;
p = p->next;
q = p->next;
p->next = L2->next;
L2->next = p;
p = q;
}
r1->next = NULL;
}
void DelMaxNode(LinkList* &L)
{
LinkList *p = L->next, *pre = L, *maxp = p, *maxpre = pre;
while (p != NULL)
{
if (maxp->data.code < p->data.code)
{
maxp = p;
maxpre = pre;
}
pre = p;
p = p->next;
}
maxpre->next = maxp->next;
free(maxp);
}