#include <stdio.h>
#include <stdlib.h>
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR -1
typedef char ElemType; //指定ElemType的类型
typedef struct LNode{
/************************************************************************/
/*定义线性单链表的结构体 */
/*Went 2011-10-14 15:08 */
/************************************************************************/
ElemType data;
struct LNode *next;
}LNode, *LinkList;
void CreateList_L(LinkList &L, int n) {
//逆位序输入n个元素的值,建立带头节点的单链线性表L。
int i = 0;
LinkList p;
L = (LinkList)malloc(sizeof(LNode));
L -> next = NULL; //建立头结点L
while(i < n) {
p = (LinkList)malloc(sizeof(LNode)); //生成新节点
scanf("%c", &p -> data); //输入元素值eg:asdbc
p -> next = L -> next;
L -> next = p; //插入到表头
i++;
printf("i = %d\n", i);
}
}//CreateList_L
int DestroyList_L(LinkList &L) {
//销毁单链线性表
LinkList p;
while(L) {
p = L -> next;
free(L);
L = p;
}
return OK;
}//DestroyList_L
int ClearList_L(LinkList &L) {
//重置单链线性表
LinkList p, q;
p = L -> next; //p指向第一个节点
while(p) {
q = p -> next;
free(p);
p = q;
}
L -> next = NULL;
return OK;
}//ClearList_L
int ListEmpty_L(LinkList L) {
//判断单链线性表是否为空
if (L -> next)
return FALSE;
else
return TRUE;
}//ListEmpty_L
int ListLength_L(LinkList L) {
//单链线性表的元素个数
LinkList p;
int count;
p = L -> next;
count = 0;
while (p) {
count ++;
p = p -> next;
}
return count;
}//ListLength_L
int GetElem_L(LinkList L, int i, ElemType &e) {
//L为带头结点的单链表的头指针
//当第i个元素存在时,其值赋给e并返回OK,否则返回ERROR
LinkList p;
int j;
if (i < 1 || i > ListLength_L(L))
return ERROR;
p = L -> next;
j = 1;
while(p && j < i) {
p = p -> next;
j++;
}
if (!p || j > i)
return ERROR;
e = p -> data;
return OK;
}//GetElem_L
int PriorElem_L(LinkList L, ElemType cur_e, ElemType &pre_e) {
//返回前驱
LinkList p, q;
p = L -> next;
while(p && p -> data != cur_e) {
q = p; //q为p的前驱
p = p -> next;
}
if (!p || p == L -> next) {
printf("No prior\n");
return ERROR;
}
pre_e = q -> data;
return OK;
}//PriorElem_L
int NextElem_L(LinkList L, ElemType cur_e, ElemType &next_e) {
//返回后继
LinkList p, q;
p = L -> next;
while(p && p -> data != cur_e) {
q = p;
p = p -> next;
}
if (!p || !p -> next) {
printf("No next\n");
return ERROR;
}
next_e = p -> next -> data;
return OK;
}//NextElem_L
int ListInsert_L(LinkList &L, int i, ElemType e) {
//在带头结点的单链线性表L中第i个位置插入元素e
LinkList p, s;
int j = 0;
p = L;
while(p && j < i - 1) { //寻找第i - 1个节点
p = p -> next;
j++;
}
if(!p || j > i - 1) //i小于1或者大于表长+1
return ERROR;
s = (LinkList)malloc(sizeof(LNode)); //生成新节点
s -> data = e;
s -> next = p -> next;
p -> next = s;
return OK;
}//ListInsert_L
int ListDelete_L(LinkList &L, int i, ElemType &e) {
//在带头结点的单链线性表L中,删除第i个元素,并由e返回其值
LinkList p, q;
int j = 0;
p = L;
q = NULL;
while(p -> next && j < i - 1) { //寻找第i个节点,并令p指向其先驱
p = p -> next;
j++;
}
if (!(p -> next) || j > i - 1) //删除位置不合理
return ERROR;
q = p -> next;
p -> next = q -> next;
e = q -> data;
free(q);
return OK;
}//ListDelete_L
void MergeList_L(LinkList &La, LinkList &Lb, LinkList &Lc) {
//已知单链线性表La和Lb的元素按值非递减排列
//归并得到Lc且元素按值非递减排列
LinkList pa, pb, pc;
pa = La -> next;
pb = Lb -> next;
Lc = pc = La; //用La的头结点作为Lc的头结点
while(pa && pb) {
if (pa -> data <= pb -> data) {
pc -> next = pa;
pc = pa;
pa = pa -> next;
}
else {
pc -> next = pb;
pc = pb;
pb = pb -> next;
}
}
pc -> next = pa ? pa : pb; //插入剩余段
free(Lb); //释放Lb的头结点
}//MergeList_L
int ListPrint_L(LinkList L) {
//打印
LinkList p;
p = L -> next;
while(p) {
printf("%c ", p -> data);
p = p -> next;
}
printf("\n");
return 1;
}
void main() {
LinkList list1;
int order, temp, result;
ElemType res;
//InitList a list
printf("input 5 elements in your list\n");
CreateList_L(list1, 5);
//If it is empty
temp = ListEmpty_L(list1);
if (temp == TRUE)
printf("The SqList is empty\n");
else
printf("The SqList is not empty\n");
//The length of a list
result = ListLength_L(list1);
printf("ListLength is %d\n", result);
//Get the specified element
temp = GetElem_L(list1, 5, res);
if (temp == ERROR)
printf("ERROR occured in GetElem_L(...)\n");
else
printf("The specified element is : %c\n", res);
//Get the prior elememt
temp = PriorElem_L(list1, 'r', res);
if (temp == ERROR)
printf("ERROR occured in PriorElem_L(...)\n");
else
printf("The prior element is : %c\n", res);
//Get the next element
temp = NextElem_L(list1, 't', res);
if (temp == ERROR)
printf("ERROR occured in NextElem_L(...)\n");
else
printf("The next element is : %c\n", res);
//Insert the list
temp = ListInsert_L(list1, 6, 'a');
if (temp == ERROR)
printf("ERROR occured in ListInsert_L(...)\n");
else
printf("List insert successfully\n");
//Delete an element
temp = ListDelete_L(list1, 1, res);
if (temp == ERROR)
printf("ERROR occured in ListDelete_L(...)\n");
else
printf("Delete successfully\n");
//Traverse the list
temp = ListPrint_L(list1);
//Clear a list
temp = ClearList_L(list1);
if (temp != OK)
printf("ERROR ACCURED IN ClearList_L\n");
else
printf("Clear Successfully!\n");
//Traverse the list
temp = ListPrint_L(list1);
//Destroy a list
temp = DestroyList_L(list1);
if (temp != OK)
printf("ERROR ACCURED IN DestroyList_L\n");
else
printf("Destroy Successfully!\n");
printf("end!");
system("pause");
}
LinkList
最新推荐文章于 2024-08-12 18:22:19 发布