下面是链表的一些基本操作,使用c语言实现
#include "HA.h"
int main()
{
int e,n,select=1;
LinkList L;
LinkList T;
printf("请输入所要创建链表的结点个数\n");
scanf("%d",&n);
printf("****************************\n");
printf("*请输入下列指定数字进行操作*\n");
printf("* [0] 退出程序 *\n");
printf("* [1] 头插法建立链表 *\n");
printf("* [2] 尾插法建立链表 *\n");
printf("* [3] 遍历链表并输出 *\n");
printf("* [4] 清空链表 *\n");
printf("* [5] 计算链表的长度 *\n");
printf("* [6] 获取指定位置的元素 *\n");
printf("* [7] 求元素第一次出现位置 *\n");
printf("* [8] 在指定位置插入元素 *\n");
printf("* [9] 删除指定位置的元素 *\n");
printf("* [10] 将链表逆转 *\n");
printf("****************************\n");
while(select)
{
printf("请选择:>>");
scanf("%d",&select);
if(select==0)
break;
switch(select)
{
case 1:
CreateListHead(&L,n);
break;
case 2:
CreateListTail(&L,n);
break;
case 3:
ListTraverse(L);
break;
case 4:
ClearList(L);
break;
case 5:
ListLength(L);
break;
case 6:
printf("请输入要求元素的位置\n");
int t;
scanf("%d",&t);
GetElem(L,t,e);
break;
case 7:
printf("请输入元素\n");
int c;
scanf("%d",&c);
LocateElem(L,c);
break;
case 8:
printf("请输入要插入的位置和元素\n");
int a,b;
scanf("%d %d",&a,&b);
ListInsert(L,a,b);
break;
case 9:
printf("请输入要删除元素的位置\n");
int y;
scanf("%d",&y);
ListDelete(L,y);
break;
case 10:
ListReverse(L,&T,3);
printf("逆转后的元素为\n");
ListTraverse(T);
break;
default:
printf("输入指令有误,请重新输入\n");
break;
}
}
}
#ifndef HA_H
#define HA_H
#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node
{
ElemType data;
struct Node *next;
}Node;
typedef struct Node *LinkList;
void CreateListHead(LinkList *L,int n);//头插法创建链表
void CreateListTail(LinkList *L,int n);//尾插法创建链表
void ListTraverse(LinkList L);//链表的遍历和输出
void ListLength(LinkList L);//求链表的长度
void ClearList(LinkList L);//将链表变为空表
void GetElem(LinkList L,int i,ElemType e);//打印第I个位置的元素
void LocateElem(LinkList L,ElemType e);//求元素e的第一次出现的位置
void ListInsert(LinkList L,int i,int e);//在第i个位置插入元素e
void ListDelete(LinkList L,int i);//删除第i个位置的元素
void ListReverse(LinkList L,LinkList *T,int n);//将链表逆转
#endif // HA_H
#include "HA.h"
void CreateListHead(LinkList *L, int n)//头插法,产生的链表顺序是反的
{
LinkList p;
int i,x;
*L = (LinkList)malloc(sizeof(Node));
(*L)->next = NULL;
printf("请输入:>>\n"); /* 先建立一个带头结点的单链表 */
for (i=0; i<n; i++)
{
scanf("%d",&x);
p = (LinkList)malloc(sizeof(Node)); /* 生成新结点 */
p->data = x; /* 随机生成100以内的数字 */
p->next = (*L)->next;
(*L)->next = p; /* 插入到表头 */
}
}
void CreateListTail(LinkList *L,int n)//尾插法,每新加入一个结点都在下一个节点的后面,产生的链表顺序正常
{
LinkList p,r;
int i,x;
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;
r=*L;
printf("请输入:>>\n");
for(i=0;i<n;i++)
{
scanf("%d",&x);
p=(LinkList)malloc(sizeof(Node));
p->data=x;
r->next=p;
r=p;
}
r->next=NULL;
}
void ListTraverse(LinkList L)//链表的遍历,依次打印出每个元素
{
LinkList p=L->next;//创建一个结点指向头结点的下一个,即创建链表的第一个结点
while(p)
{
printf("%d\n",p->data);
p=p->next;//每一次的p都变换位置,所以可以访问到链表的每一个元素
}
}
void ListLength(LinkList L)//返回线性表的长度
{
int i=0;
LinkList p=L->next;
while(p)
{
i++;
p=p->next;
}
printf("线性表的长度为:%d\n",i);
}
void ClearList(LinkList L)//将L变成空表
{
LinkList p,q;
p=L->next;
while(p)
{
q=p->next;
free(p);
p=q;
}
L->next=NULL;
}
void GetElem(LinkList L,int i,ElemType e)//打印第i个位置的元素e
{
int j;
LinkList p;
p=L->next;
j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
e=p->data;
printf("%d\n",e);
}
void LocateElem(LinkList L,ElemType e)//打印第一个和l相同的元素
{
int i=0,j=0,t=0;
int flag=0;
LinkList p;
p=L->next;
while(p)
{
i++;
if(p->data==e)
{
j=i;
break;
}
p=p->next;
}
printf("第一个:%d\n",j);
}
void ListInsert(LinkList L,int i,int e)//在第i个位置插入元素e
{
int j;
LinkList p,s;
p=L;
j=1;
while(p&&j<i)
{
p=p->next;
j++;
}
s=(LinkList)malloc(sizeof(Node));
s->data=e;
s->next=p->next;
p->next=s;
}
void ListDelete(LinkList L,int i)//删除第i个位置的元素
{
int j;
LinkList p,q;
p=L;
j=1;
while(p->next&&j<i)
{
p=p->next;
j++;
}
q=p->next;//结点q的删除
p->next=q->next;
free(q);
}
void ListReverse(LinkList L,LinkList *T,int n)//逆转L为P
{
LinkList p,q;
int i;
q=L->next;
*T=(LinkList)malloc(sizeof(Node));
(*T)->next=NULL;
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));
p->data=q->data;
q=q->next;
p->next=(*T)->next;
(*T)->next=p;
}
}