数据结构线性表的链式存储结构c语言版
链表的头插法创建,尾插法创建,输入,输出,插入,删除,按值查找,按位查找,删除,销毁操作
C代码
#include<stdio.h>
#include<stdlib.h>
typedef int ElemType;
typedef struct LNode{ //定义单链表结点类型
ElemType data;
struct LNode *next;
}LNode, *LinkList;
ListHeadInsert(LinkList &L,int n); //头插法创建单链表
ListTailInsert(LinkList &L,int n); //尾插法创建单链表
ListInsert(LinkList &L,int i, ElemType e); //在某一结点前插入
Listdeldata(LinkList &L,int i); //删除结点数据
Listlocatedata(LinkList &L,ElemType e); //按值查找
Listgetdata(LinkList &L,int i); //按位置查找
void FreeList(LinkList L); //销毁单链表
void displayData(LinkList L); //单链表输出
ListHeadInsert(LinkList &L,int n)
{
int i;
LinkList p; //创建新结点p
L=new LNode; //给L分配空间
L->next=NULL; //L的next域为空
for(i=n;i>0;i--)
{
p=(LNode*)malloc(sizeof(LNode)); //创建新结点
printf("请输入第%d数据:",i);
scanf("%d",&(p->data));
p->next=L->next; // L为头指针
L->next=p;
}
printf("创建成功!\n");
return 1;
}
ListTailInsert(LinkList &L,int n)
{
int i;
LinkList p,q; //创建新表p,q
L=new LNode; //给L分配空间
L->next=NULL; //L的next结点为空
q=L; //创建头表
for(i=0;i<n;i++)
{
p=new LNode; //创建新表
printf("请输入第%d数据:",i+1);
scanf("%d",&p->data);
p->next=q->next; //头表q的next指针给新单链表p
q->next=p; //头表q指向下个单链表p
q=p; //p作为新的头表
}
printf("创建成功!\n");
return 1;
}
Listlocatedata(LinkList &L,ElemType e)
{
int count=0;
LinkList p;
p=L;
while(p->data!=e && p->next!=NULL){
p=p->next;
count++;
}
if(p->next==NULL && p->data!=e){
printf("没有找到!\n");
}
else{
printf("该元素位于链表的第 %d 位\n",count);
}
return 1;
}
Listgetdata(LinkList &L,int i)
{
int count=0;
LinkList p,q; //创建临时结点p,q
p=L;
while(p&&count<i){ //找到待删除结点的上一个结点
p=p->next;
count++;
}
if(!p||count>i||i<=0){
printf("输入位置错误!\n");
return 0;
}
printf("该位置的数据是: %d\n ",p->data);
return 1;
}
ListInsert(LinkList &L,int i, ElemType e)
{
int count=0;
LinkList p,q; //创建临时结点p和插入结点q
p=L;
while(p&&count<i-1){ //找到插入位置的上一个结点p
p=p->next;
count++;
}
if(!p||count>i-1){
printf("插入位置错误!\n");
return 0;
}
else{
q=new LNode; //为新结点分配空间
q->data=e;
q->next=p->next; //新结点指向p结点的下一个结点
p->next=q; //p结点指向q结点
printf("插入成功!\n");
}
return 1;
}
Listdeldata(LinkList &L,int i)
{
int count=0;
LinkList p,q; //创建临时结点p,q
p=L;
while(p&&count<i-1){ //找到待删除结点的上一个结点
p=p->next;
count++;
}
if(!p||count>i-1){
printf("输入位置错误!\n");
return 0;
}
q=p->next; //令q指向被删除的结点
p->next=q->next; //将p结点指向待删除结点的下一个结点
free(q); //释放结点的存储空间
return 1;
}
void FreeList(LinkList L)
{
LinkList p,q;
p=L;
while(p!=NULL){ //当该结点不是链尾时
q=p->next; //让q指向头结点的后续结点
free(p);
p=q; //p指针指向下一个结点
}
L=NULL; //将头结点指针为0
printf("该链表已成功被销毁!\n ");
}
void displayData(LinkList L )
{
LNode *p=L->next;
printf("该链表为: ");
while(p)
{
printf("%d ",p->data);
p=p->next;
}
printf("\n");
}
int main()
{
int n,i;
ElemType e;
LinkList L;
printf("\n\n\n");
printf("\n\t\t\t\t\t\t1.头插法创建单链表");
printf("\n\t\t\t\t\t\t2.尾插法创建单链表");
printf("\n\t\t\t\t\t\t3.插入数据");
printf("\n\t\t\t\t\t\t4.删除数据");
printf("\n\t\t\t\t\t\t5.按值查找");
printf("\n\t\t\t\t\t\t6.按位查找");
printf("\n\t\t\t\t\t\t7.销毁单链表");
printf("\n\t\t\t\t\t\t8.输出");
printf("\n\t\t\t\t\t\t9.退出\n\n");
while(1)
{
printf("\n请输入您想选择的操作: ");
int k;
scanf("%d",&k);
switch(k)
{
case 1:
printf("请输入你想输入数据个数:");
scanf("%d",&n);
ListHeadInsert(L,n);
break;
case 2:
printf("请输入你想输入数据个数:");
scanf("%d",&n);
ListTailInsert(L,n);
break;
case 3:
printf("请输入你想在哪插入数据:");
scanf("%d",&i);
printf("请输入你想输入的数据:");
scanf("%d",&e);
ListInsert(L, i, e);
break;
case 4:
printf("请输入你想删除的位置:");
scanf("%d",&i);
Listdeldata(L, i);
break;
case 5:
printf("请输入你想查找的数据:");
scanf("%d",&e);
Listlocatedata(L,e);
break;
case 6:
printf("请输入你想查找的位置:");
scanf("%d",&i);
Listgetdata(L,i);
break;
case 7:
FreeList( L);
break;
case 8:
displayData(L);
break;
case 9:
return 0;
}
}
}