#include <stdio.h>
#include <stdlib.h>
typedef int ElemType;
typedef struct Node{
ElemType data;
struct Node *next;
}LinkNode,*LinkList;
/*
p: pointer
q: next character of p,another pointer
*/
LinkList Creat_LinkList( ) //头插入法建立单链表算法
{
LinkList head;
LinkNode *p;
head=(LinkList)malloc(sizeof(LinkNode));
head->next=NULL;
char flag='Y';
printf("开始用头插法创建单链表\n");
while(flag=='Y'||flag=='y'){
p=(LinkNode*)malloc(sizeof(LinkNode)); //申请新节点
printf("请输入新结点数据");
scanf("%d",&p->data);
p->next=head->next; //让尾为NULL
head->next=p;
getchar();
printf("继续输入?y/n");
scanf("%c",&flag);
}
return head;
}
void OutputNode(LinkList L){
LinkNode *p;
p=L->next;//指向头结点后的第一个结点
while(p->next!=NULL){
printf("%4d",p->data);
p=p->next;
}
printf("%4d",p->data); //打印最后一个元素
}
/*按序号查找 Get_Linklist(L,i)
在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
/*插入运算 Insert_LinkList(L,i,x)
在单链表L的第i个位置上插入值为x的元素*/
LinkList Insert_LinkList(LinkList L, int i, ElemType x)
{
LinkNode *p1=L->next;
int index=1;
//边界判断
if(i<1)
return NULL;
while(index!=i&&p1!=NULL){
index++;
p1=p1->next;
}
if(p1==NULL&&i>index)
return NULL;
else{
//进行插入操作
int flag=1;
LinkNode *p;
LinkNode *q;
p=L; //指向头结点后的第一个结点
while(p->next!=NULL)
{ if(flag==i){
q=(LinkNode *)malloc(sizeof(LinkNode)); //申请新节点
q->data=x;
//
q->next=p->next;
p->next=q;
return L;
}
p=p->next;
flag++;
}
}
}
/*删除运算:Del_LinkList(L,i)
删除单链表L上的第i个数据结点*/
int Del_LinkList(LinkList L, ElemType i)
{ //边界判断
LinkNode *p1=L->next;
int index=1;
if(i<1)
return 0;
while(index!=i&&p1!=NULL){
index++;
p1=p1->next;
}
if(p1==NULL&&i>index)
return 0;
int flag=1;
LinkNode *p;
LinkNode *t;
p=L; //指向头结点后的第一个结点
while(p->next!=NULL)
{
if(flag==i){
t=p; //保存p的前驱结点
p=p->next; //跳过当前p节点
t->next=p->next; //将前驱节点和后继节点连接
int k=p->data;
free(p);
return k;
}
p=p->next;
flag++;
}
}
/*按序号查找 Get_Linklist(L,i)
在单链表L中查找第i个元素结点,找到返回其指针,否则返回空*/
LinkNode *LocateNode(LinkList head,ElemType i)
{ int flag=1;
LinkNode *p;
p=head->next; //指向头结点后的第一个结点
while(p->next!=NULL)
{ if(flag==i){
return p;}
p=p->next;
flag++;
}
}
int main(){
int i,e,k;
LinkList L;
LinkNode *p;
do
{
printf("\n\n\n\n");
printf("\t\t\t 链表子系统\n");
printf("\t\t*******************************\n");
printf("\t\t* 1----建 表 *\n");
printf("\t\t* 2----插 入 *\n");
printf("\t\t* 3----删 除 *\n");
printf("\t\t* 4----查 找 *\n");
printf("\t\t* 5----显 示 *\n");
printf("\t\t* 0----返 回 *\n");
printf("\t\t*******************************\n");
printf("\t\t 请选择菜单项(0-6):");
scanf("%d",&k); //getchar();
switch(k)
{
case 1:
L=Creat_LinkList( );
printf("链表的存储顺序为:");
OutputNode(L);
break;
case 2:
printf("请输入插入位置和插入数据:");
scanf("%d%d",&i,&e);
p=Insert_LinkList(L,i,e);
if(p!=NULL){
printf("插入操作成功!插入元素后链表如下\n");
OutputNode(L);
}
else printf("插入操作失败\n");
break;
case 3:
printf("请输入删除元素的位置:");
scanf("%d",&i);
k=Del_LinkList(L,i);
if(k==0)
printf("删除失败\n");
else
{
printf("删除成功\n");
printf("删除元素值为 %d\n",k);
printf("删除后链表存储顺序为:");
OutputNode(L);
}
break;
case 4:
printf("请输入要查找的序号i:");
scanf("%d",&i);
p=LocateNode(L,i);
if (p!=NULL)
{
OutputNode(L);printf("中序号为%d的值是%d ",i,p->data);}
else
printf("链表中无此序号!!\n");
break;
case 5:
printf("链表的存储顺序为:");
OutputNode(L);
break;
}
}
while(k!=0);
return 0;
}
单链表头插法c语言
最新推荐文章于 2023-06-27 12:22:18 发布