#include <stdio.h>
#include <stdlib.h>
#include <time.h>
/**************************************************************************/
/* 抽象数据类型线性表基本操作*/
/* 1.InitLinkList函数,初始化线性表,创建表头指针并置为NULL*/
/* 2.CreateLinkList函数,创建线性表,此函数输入为负数则停止输入*/
/* 3.PrintLinkList函数,遍历输出线性表*/
/* 4.DestroyLinkList函数,销毁线性表释放内存空间*/
/* 5.ClearLinkListt函数,清空线性表释放内存空间*/
/* 6.GetElemLinkList函数,返回线性链表第i个元素*/
/* 10.InsertLinkList函数,插入线性表*/
/* 11.InsertFirst函数,向单链表的表头插入一个元素 */
/* 12.InserLast函数,向单链表的末尾添加一个元素 */
/* 13.DeleteLinkList,删除链表第i个元素 */
/* 14.DeleteFisrt,删除链表第1个元素 */
/* 15.DeleteLast,删除链表最后一个元素 */
/* 16.SortLinkList函数,升序*/
/* 17.SortedLinkList函数,降序*/
/* 18.MergeLinkList函数,合并L1和L2*/
/* 19.CopyLinkList函数,合并L1和L2*/
/* 20.SearchLinkList函数,查找元素e是否在链表中,返回索引值*/
/**************************************************************************/
#define OK 1
#define ERROR 0
typedef int ElemType;
typedef struct LNode{
ElemType elem;
struct LNode *next;
}LNode,*LinkList;
/***************************初始化线性链表***********************************/
int InitLinkList(LinkList *L){ //创建头指针
*L=(LinkList)malloc(sizeof(LNode));
if(!L){
printf("内存分配失败,初始化失败!\n");
return ERROR;
}
(*L)->next=NULL;
return OK;
}
/***************************构建线性链表***********************************/
int CreateLinkList(LinkList L){
LinkList L1; //用次变量创建新链表节点
LinkList L2; //用次遍历递归连接插入新节点
ElemType elem; //接收输入数据
L2=L;
printf("请输入数据:");
scanf("%d",&elem);
getchar(); //接收缓存中的回车键
while(elem>0){ //输入大于0有效
L1=(LinkList)malloc(sizeof(LNode));
if(!L1){
printf("内存分配失败,构建链表失败!\n");
return ERROR;
}
L1->elem=elem;
L1->next=NULL;
L2->next=L1;
L2=L1;
printf("请输入数据:");
scanf("%d",&elem);
getchar(); //接收缓存中的回车键
}
return OK;
}
/***************************打印线性链表***********************************/
int PrintLinkList(LinkList L){
if(L==NULL){
printf("LinkList is NULL!\n");
return ERROR;
}
if(L->next == NULL){
printf("链表为空表!\n");
return ERROR;
}
L=L->next;
printf("打印链表元素: ");
while(L != NULL){
printf("--%d--",L->elem);
//printf("--%x--",L);
L=L->next;
}
printf("\n");
printf("链表元素打印完毕!\n");
return OK;
}
/***************************销毁线性链表***********************************/
int DestroyLinkList(LinkList *L){
LinkList L1;
LinkList L2;
L1=*L;
while(L1 != NULL){
L2=L1->next;
free(L1);
L1=NULL;
L1=L2;
}
free(*L);
*L=NULL;
return OK;
}
/***************************清空线性链表***********************************/
int ClearLinkListt(LinkList L){
LinkList L1;
LinkList L2;
L1=L;
while(L1 != NULL){
L2=L1->next;
free(L1);
L1=NULL;
L1=L2;
}
L->next=NULL;
return OK;
}
/***************************返回线性链表第i个元素**************************/
ElemType GetElemLinkList(const LNode *L,int i){
if(i<0){
printf("下标越界,返回失败!\n");
return ERROR;
}
LNode *L1;
ElemType e;
L1=L->next;
for(int j=0;j!=i;j++){
if(L1 == NULL){ //遍历到第i个元素之前已经到达链表终点,下标越界,返回错误
printf("下标超界,返回失败!\n");
return ERROR;
}
L1=L1->next;
}
e=L1->elem;
return e;
}
/***************************在第i个位置插入元素e**************************/
ElemType InsertLinkList(LinkList L,int i,ElemType e){ //L2作为新建链表节点,因为L不能改变,L1作为L2连接到L的中间人,
LinkList L1;
LinkList L2;
if(i<0){
printf("下标越界,插入失败!\n");
return ERROR;
}
L1=L;
for(int j=0;j != i;j++){
if(L1 == NULL){ //遍历到第i个元素之前已经到达链表终点,下标越界,返回错误
printf("下标超界,返回失败!\n");
return ERROR;
}
L1=L1->next;
}
L2=(LinkList)malloc(sizeof(LNode));
if(!L2){
printf("内存分配失败!\n");
return ERROR;
}
L2->elem=e;
L2->next=L1->next;
L1->next=L2;
return e;
}
/***************************在表头位置插入元素e**************************/
ElemType InsertFirst(LinkList L,ElemType e){
LinkList L1;
LinkList L2;
L1=L;
L2=(LinkList)malloc(sizeof(LNode));
if(!L2){
printf("内存分配失败!\n");
return ERROR;
}
L2->elem=e;
L2->next=L1->next;
L1->next=L2;
return e;
}
/***************************在表尾位置插入元素e**************************/
ElemType InsertLast(LinkList L,ElemType e){
LinkList L1;
LinkList L2;
L1=L;
//for(int i=0; L1->next !=NULL;i++){
while(L1->next != NULL){
L1=L1->next;
}
L2=(LinkList)malloc(sizeof(LNode));
if(!L2){
printf("内存分配失败!\n");
return ERROR;
}
L2->elem=e;
L2->next=L1->next;
L1->next=L2;
return e;
}
/***************************删除第i个元素**************************/
ElemType DeleteLinkList(LinkList L,int i){
LinkList L1;
LinkList L2;
ElemType e;
L1=L;
if(i<0){
printf("下标越界,删除失败!\n");
return ERROR;
}
for(int j=0;j!=i;j++){
if(L1 == NULL){ //遍历到第i个元素之前已经到达链表终点,下标越界,返回错误
printf("下标超界,删除失败!\n");
return ERROR;
}
L1=L1->next;
}
L2=L1->next;
L1->next=L2->next;
e=L2->elem;
free(L2);
L2=NULL;
return e;
}
/***************************删除第1个元素**************************/
ElemType DeleteFisrt(LinkList L){
LinkList L1;
ElemType e;
L1=L->next;
L->next=L1->next;
e=L1->elem;
free(L1);
L1=NULL;
return e;
}
/***************************删除最后一个元素**************************/
ElemType DeleteLast(LinkList L){
LinkList L1;
LinkList L2;
ElemType e;
L1=L2=L;
//for(int j=0;L1->next != NULL;j++){
while(L2->next != NULL){
L1=L2;
L2=L1->next;
}
L1->next=NULL;
e=L2->elem;
free(L2);
L2=NULL;
return e;
}
/***************************升序**************************/
int SortLinkList(LinkList L){
LinkList L1;
LinkList L2;
L1=L2=L->next;
while(L1!=NULL){
L2=L1->next;
while(L2 != NULL){
if(L2->elem<L1->elem){
L1->elem=L1->elem^L2->elem;
L2->elem=L1->elem^L2->elem;
L1->elem=L1->elem^L2->elem;
}
L2=L2->next;
}
L1=L1->next;
}
return OK;
}
/***************************降序**************************/
int SortedLinkList(LinkList L){
LinkList L1;
LinkList L2;
L1=L2=L->next;
while(L1!=NULL){
L2=L1->next;
while(L2 != NULL){
if(L2->elem>L1->elem){
L1->elem=L1->elem^L2->elem;
L2->elem=L1->elem^L2->elem;
L1->elem=L1->elem^L2->elem;
}
L2=L2->next;
}
L1=L1->next;
}
return OK;
}
/***************************合并两个线性表**************************/
LinkList MergeLinkList(LinkList *L1,LinkList *L2){
LinkList L3;
L3=*L1;
while((*L1)->next!= NULL){
(*L1)=(*L1)->next;
}
(*L1)->next=(*L2)->next;
*L1=NULL;
free(*L2);
*L2=NULL;
return L3;
}
/***************************深拷贝一个链表**************************/
LNode *CopyLNode(LNode L){
LNode *L_copy;
L_copy=(LNode *)malloc(sizeof(LNode));
if(!L_copy){
printf("内存分配失败!\n");
return L_copy;
}
L_copy->elem=L.elem;
L_copy->next=NULL;
return L_copy;
}
LinkList CopyLinkList(LinkList L){
LinkList L_copy;
LinkList L1;
LinkList L2;
InitLinkList(&L_copy);
L2=L_copy;
L=L->next;
while(L != NULL){
L1=CopyLNode(*L);
L2->next=L1;
L2=L1;
L=L->next;
}
return L_copy;
}
/**************************查找元素e,返回索引值**************************/
int SearchLinkList(LinkList L,ElemType e){
int i=0;
L=L->next;
while(L != NULL){
if(e == L->elem){
printf("%d在链表第%d个元素!\n",e,i);
return i;
}
i++;
L=L->next;
}
printf("e元素不在链表中!\n");
return ERROR;
}
int main()
{
LinkList L;
LinkList L1,L2,L3;
int i;
ElemType e;
int a[] = {1504,3,42,42,8,183,22,238,85,18,22,18,31};
time_t t;
printf("L_adr=%x\n",L);
InitLinkList(&L);
InitLinkList(&L1);
InitLinkList(&L2);
//CreateLinkList(L);
//PrintLinkList(L);
//DestroyLinkList(&L);
//ClearLinkListt(L);
//PrintLinkList(L);
//printf("L_adr=%x\n",L);
for(i=0;i<(sizeof(a)/sizeof(int));i++){
int cnt=rand()%(i+1);
//InsertLinkList(L,cnt,a[i]);
//InsertFirst(L,a[i]);
InsertLast(L,a[i]);
PrintLinkList(L);
SortLinkList(L);
PrintLinkList(L);
}
for(i=0;i<10;i++){
SearchLinkList(L,33);
}
/* srand(6);
for(i=0;i<(sizeof(a)/sizeof(int));i++){
int cnt=rand()%(i+1);
InsertLinkList(L1,cnt,a[i]);
}
//PrintLinkList(L1);
srand(600);
for(i=0;i<(sizeof(a)/sizeof(int));i++){
int cnt=rand()%(i+1);
InsertLinkList(L2,cnt,a[i]);
}
// PrintLinkList(L2);
//L3=L2;
L3=CopyLinkList(L2);
PrintLinkList(L2);
PrintLinkList(L3);
ClearLinkListt(L3);
PrintLinkList(L2);
PrintLinkList(L3);*/
/*L3=MergeLinkList(&L1,&L2);
printf("test1\n");
PrintLinkList(L1);
printf("test1\n");
PrintLinkList(L2);
printf("test1\n");
PrintLinkList(L3);*/
/*for(i=(sizeof(a)/sizeof(int))-1;i>=0;i--){
int cnt=rand()%(i+1);
//ElemType e=GetElemLinkList(L,cnt);
//e=DeleteLinkList(L,cnt);
//e=DeleteFisrt(L);
e=DeleteLast(L);
printf("L[%d]=%d\n",cnt,e);
PrintLinkList(L);
}*/
return 0;
}
C语言从零开始之数据结构与算法单链线性表基本操作(2)
最新推荐文章于 2022-08-03 18:20:40 发布
本文介绍了使用C语言实现线性链表的基本操作,包括初始化、创建、打印、销毁、清空、获取指定位置元素、插入、删除等,并提供了相应的函数实现和示例代码。此外,还涉及到了线性链表的排序和查找功能。
摘要由CSDN通过智能技术生成