参考数据结构(c语言描述)徐孝凯著
头文件List.h
#ifndef LIST_H_INCLUDED
#define LIST_H_INCLUDED
typedef int ElemType;
typedef struct SingleNode
{
ElemType data;
struct SingleNode* next;
}List;
#endif
线性表在链接存储下运算的算法.c
#include <stdio.h>
#include <stdlib.h>
#include "List.h"
/***************************************************************/
//初始置空线性表
/***************************************************************/
void initList(List *L,int ms)//参数L的next域为表头指针,ms参数暂且闲置不用
{
//L=malloc(sizeof(List)*30);
L->next=NULL;
}
/**************************************************************/
//得到线性表中第pos个元素的值
/*************************************************************/
int getList(List* L,ElemType* item,int pos)//item带回pos参数值,成功返回1,失败返回0
{
List* p=L->next;
int i=0;
while(p!=NULL)
{
i++;
if(i==pos)
{
break;
}
p=p->next;
}
if(p==NULL)
{
return 0;
}
else
{
*item=p->data;
return 1;
}
}
/****************************************************************/
//从线性表中查找与item值相匹配的第一个元素并有参数带回
/****************************************************************/
int findList(List* L,ElemType* item)
{
List* p=L->next;
while(p!=NULL)
{
if(p->data=*item)
{
break;
}
p=p->next;
}
if(p==NULL)
{
return 0;
}
*item=p->data;
return 1;
}
/*****************************************************************/
//修改线性表中第一个相匹配的元素
/*****************************************************************/
int modifyList(List* L,ElemType* item,ElemType* modify)
{
List* p=L->next;
while(p!=NULL)
{
if(p->data==*item)
{
break;
}
p=p->next;
}
if(p==NULL)
{
return 0;
}
p->data=*modify;
return 1;
}
/******************************************************************/
//向线性表中给定位置插入一个元素
/******************************************************************/
int insertList(List* L,ElemType item,int pos)//向线性表中的指定位置插入一个新元素,成功返回1,失败返回0;
{
int i=0;
List *r,*p,*q;
r=malloc(sizeof(List));//储存插入节点元素
r->data=item;
p=L->next;
q=L; //把q当成替身
while(p!=NULL)
{
i++;
if(i==pos)
{
break;
}
else
{
q=p;
p=p->next;
}
}
if(i==pos)
{
r->next=p;
q->next=r;
return 1;
}
if(pos==0||pos==i+1)
{
r->next=p;
q->next=r;
return 1;
}
return 0;
}
/********************************************************************/
//从线性表中删除一个元素
/********************************************************************/
int deleteList(List* L,ElemType* item)
{
List* p=L->next;
List* q=L;
while(p!=NULL)
{
if(p->data==*item)
{
break;
}
q=p;
p=p->next;
}
if(p==NULL)
{
return 0;
}
q->next=p->next;
*item=p->data;
free(p);
return 1;
}
/*************************************************/
//判断线性表是否为空
/*************************************************/
int emptyList(List* L)
{
return L->next==NULL;
}
/**************************************************************/
//求出线性表长度
/*************************************************************/
int lengthList(List* L)
{
int n=0;
List* p=L->next;
while(p!=NULL)
{
n++;
p=p->next;
}
return n;
}
/************************************************************/
//遍历输出线性表
/************************************************************/
void outputList(List* L)
{
List* p=L->next;
while(p!=NULL)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
/*************************************************************/
//按元素的值或关键字对线性表进行排序
/************************************************************/
List* sortList(List* L)
{
List *p,*q;
q=malloc(sizeof(List));
initList(q,1);
p=L->next;
while(p!=NULL)
{
ElemType x=p->data;
List *t=q->next,*s=q,*temp;
while(t!=NULL&&x>=t->data)
{
s=t;
t=t->next;
}
temp=malloc(sizeof(List));
temp->data=x;
temp->next=t;
s->next=temp;
p=p->next;
}
return q;
}
/*****************************************************************/
//清除线性表中的所有元素
/*****************************************************************/
void clearList(List* L)
{
List *p=L->next,*q;
while(p!=NULL)
{
q=p;
p=p->next;
free(q);
}
L->next=NULL;
}
/*******************************************************************/
主函数
#include <stdio.h>
#include <stdlib.h>
#include "List.h"
#include "线性表在链接存储下运算的算法.c"
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int main(int argc, char *argv[])
{
int i,yn;
ElemType x,y;
List bb,*L=&bb;
List *pa;
int a[12]={25,45,38,23,19,66,77,88,65,23,44,20};
initList(L,1);
for(i=0;i<12;i++)
{
insertList(L,a[i],0);
}
printf("线性表L:\n");
outputList(L);
printf("从头开始每隔一个访问线性表L:\n");
for(i=0;i<12;i+=2)
{
yn=getList(L,&x,i+1);
if(yn)
{
printf("%d ",x);
}
}
printf("\n");
for(i=0;i<12;i+=3)
{
x=a[i];
deleteList(L,&x);
}
printf("删除运算后的线性表L:\n");
outputList(L);
insertList(L,30,3);
insertList(L,50,5);
printf("再插入30和50元素后的线性表L:\n");
outputList(L);
x=45;
yn=findList(L,&x);
if(yn)
{
printf("查找%d成功!\n",x);
}
else
{
printf("查找%d失败!\n",x);
}
x=65;
y=66;
yn=modifyList(L,&x,&y);
if(yn)
{
printf("修改%d成功!\n");
}
else
{
printf("修改%d失败!\n");
}
yn=emptyList(L);
if(yn)
{
printf("线性表L为空!\n");
}
else
{
printf("线性表非空!\n");
}
pa=sortList(L);
printf("由L得到的有序线性表:\n");
outputList(pa);
clearList(L);
clearList(pa);
return 0;
}
运行结果