内容一,带头结点的单链表建立
头文件LinkedList.h
含有一些链表的 基本操作
typedef char DataType;
typedef struct node
{
DataType data;
struct node *next;
}LinkedList;
//置空表
void InitList(LinkedList *L)
{
L->next=NULL;
}
//获取表长
int GetListLength(LinkedList *L)
{
LinkedList *p;
int len=0;
p=L->next;
while(p!=NULL)
{
len++;
p=p->next;
}
return len;
}
//取结点,查找链表中的第pos个位置(从1开始计数)的元素。未找到返回NULL。
LinkedList* GetListElem(LinkedList *L,int pos)
{
//获取表长
int now=0;
LinkedList *p=L->next;
//超出范围
if(pos > GetListLength(L) || pos<1)
return NULL;
//查找。。
while(p!=NULL)
{
now++;
if(now == pos)
{
return p;
}
else
{
p=p->next;
}
}
return NULL;
}
//带头结点的单链表。查找key值所在结点,未找到返回NULL
LinkedList* LocateListElem(LinkedList* L,DataType key)
{
LinkedList* p=L->next;
while(p!=NULL)
{
if(p->data==key)
{
return p;
}
else
{
p=p->next;
}
}
return NULL;
}
//带头结点的单链表。插入元素。pos:插入位置。key插入值,成功返回1,插入失败返回0。
int InsertList(LinkedList *L,int pos,DataType key)
{
LinkedList *p,*newNode;
int len=GetListLength(L);
//新建结点
newNode= new struct node;
newNode->data=key;
newNode->next=NULL;
//检查插入范围
if( pos>=1 && pos <=len+1)
{
//插入到1~len之间
p=GetListElem(L,pos-1);
if(p==NULL)
{
//必为空表中插入第一个元素
L->next=newNode;
return 1;
}
newNode->next=p->next;
p->next=newNode;
return 1;
}
else
{
return 0;
}
}
//带头结点的单链表。删除pos这个位置的元素,并且将这个元素的值保存在e中。删除成功返回1,失败返回0。
int DelListElem(LinkedList *L,int pos,DataType *e)
{
LinkedList *p,*pre;
int len=GetListLength(L);
if(pos<1 || pos> len)
return -1;
//得到该位置的元素
p=GetListElem(L,pos);
//得到该位置的前一个元素
pre = GetListElem(L,pos-1);
if(pre==NULL)
{
//说明pos是第一个位置
pre=L;
}
if(e!=NULL)
*e=p->data;
pre->next=p->next;
return 1;
}
//带头结点的单链表。建立链表。尾插法。
LinkedList* CreateListR(DataType keys[],int n)
{
LinkedList *L=new LinkedList, *p, *pre;
int i;
L->next=NULL;
pre=L;
for(i=0;i<n;i++)
{
p = new struct node;
p->data=keys[i];
p->next=NULL;
pre->next=p;
pre=p;
}
return L;
}
//带头结点的单链表。建立链表。头插法。
LinkedList* CreateList(DataType keys[],int n)
{
LinkedList *L=new LinkedList, *p, *pre;
int i;
L->next=NULL;
pre=L;
for(i=0;i<n;i++)
{
p = new struct node;
p->data=keys[i];
p->next=L->next;
L->next=p;
}
return L;
}
//带头结点的单链表。按照结点顺序,以字符方式输出链表。
void PrintList(LinkedList *L)
{
LinkedList *p=L->next;
printf("字符链表结果:\n( ");
while (p!=NULL)
{
//将datatype按照字符类型输出
printf("%c ",p->data);
p=p->next;
}
printf(")\n");
}
void PrintListInline(LinkedList *L)
{
LinkedList *p=L->next;
printf("(");
while (p!=NULL)
{
//将datatype按照字符类型输出
printf("%c",p->data);
p=p->next;
if (p != NULL)
{
printf(", ");
}
}
printf(")\n");
}
DataType* ToArray(LinkedList* L,int *length)
{
int len=GetListLength(L),i=0;
DataType* dt=new DataType[len];
LinkedList *p=L->next;
while (p!=NULL)
{
dt[i++]=p->data;
p=p->next;
}
*length=len;
return dt;
}
void TestLinkedList()
{
char str[50];
int len=0;
LinkedList *L1,*L2;
scanf("%s",str);
while(str[len])
len++;
//尾插法
L1=CreateListR(str,len);
//头插法
L2=CreateList(str,len);
//清空
InitList(L1);
PrintList(L1);
//插入
InsertList(L1,1,'1');
PrintList(L1);
InsertList(L1,2,'2');
PrintList(L1);
InsertList(L1,2,'3');
PrintList(L1);
InsertList(L1,2,'4');
PrintList(L1);
//删除
DelListElem(L1,1,NULL);
PrintList(L1);
DelListElem(L1,5,NULL);
PrintList(L1);
DelListElem(L1,3,NULL);
PrintList(L1);
gets(str);
}