//单链表
// 引用库函数
#include<stdio.h>
#include<Stdlib.h> /*含ma l l o c ( ) 的头文件*/
//定义Elemtype元素类型
typedef int Elemtype; //
//定义结构体
typedef struct LNode{
Elemtype data; //数据域
struct LNode *next; //指针域
}Node,*LinkList; //LNode,*LinkList相当于 LNode的别名
//函数声明
void ListPrintf(Node *l);
LinkList Link_init();
LinkList Link_addhead(); //头插
LinkList Link_addtail(); //尾插
LinkList Link_add(LinkList l,int i); //插入到第i个位置上
LinkList datasolid();
LinkList LocateElemByData(LinkList l,int i); //按值查找结点值
LinkList LocateElemByID(LinkList l,int i); //按序号查找结点值
LinkList Link_delete(LinkList l,int i); //删除结点操作
int GetLength(LinkList l); //求表长操作
#include <stdio.h>
int main()
{
Node *list,*p;
int x,i;
printf(" 请选择 操作!\n");
printf(" 1.头插法加入结点\n");
printf(" 2.尾插法加入结点\n");
printf(" 3.数据固化\n");
printf(" 4.按值查找结点值\n");
printf(" 5.按序号查找结点值 \n");
printf(" 6.在第 i个位置上插入新的结点 \n");
printf(" 7.在第 i个位置删除结点 \n");
printf(" 8.求表长操作 \n");
scanf("%d",&x);
switch(x)
{
case 1: list = Link_addhead(); ListPrintf(list); break;
case 2: list = Link_addtail(); ListPrintf(list); break;
case 3: list = datasolid(); ListPrintf(list); break;
case 4: list = datasolid(); printf("请输入你要查找的元素的值 \n");
scanf("%d",&i); p=LocateElemByData(list,i); break;
case 5: list = datasolid(); printf("请输入你要查找的结点位置i \n");
scanf("%d",&i);
p=LocateElemByID(list,i); printf("查到的结点值:%d \n",p->data); break;
case 6: list = datasolid();
printf("请输入你要插入的结点位置i \n");
scanf("%d",&i);
Link_add(list,i) ; ListPrintf(list);break;
case 7: list = datasolid();
printf("请输入你要删除的结点位置i \n");
scanf("%d",&i);
Link_delete(list,i);
ListPrintf(list); break;
case 8: list = datasolid();
int i =GetLength(list);
printf("链表长度为:%d \n",i);
ListPrintf(list); break;
}
printf("\n");
return 0;
}
//单链表的初始化
LinkList Link_init()
{
Node *l;
l=(LinkList)malloc(sizeof(Node)); //申请结点空间
if(l == NULL)
printf("申请内存空间失败 \n");
l->next = NULL; //将next设置为NULL,初始长度为0的单链表
return l;
}
//打印链表
void ListPrintf(Node *l)
{
Node *list,*start;
list =l;
printf("打印链表:");
for(start = list->next; start != NULL; start = start->next)
{
printf("%d ",start->data);
}
}
//单链表的建立法一,头插法建立单链表
LinkList Link_addhead()
{
Node *l,*s;
LinkList p1;
s=l;
Elemtype x =1; //x为链表数据域中的数据
l= Link_init(); //初始化链表
printf("请输入你要加入的结点值");
scanf("%d",&x);
while(x!=0)
{
Node *p;
p = (LinkList)malloc(sizeof(Node)); //申请新的结点
p->data = x; //结点数据域赋值
p->next = l->next; //将结点插入到表头L-->|2|-->|1|-->NULL
l->next = p;
printf("p结点的数据:%d \n",p->data);
scanf("%d",&x);
}
return l;
}
//单链表的建立法一,尾插法建立单链表
LinkList Link_addtail()
{
Node *l,*r; //r为新增 的表尾指针
l= Link_init(); //初始化链表
r=l;
int x;
printf("请输入你要加入的结点值");
scanf("%d",&x);
while(x!=0)
{
Node *s;
s = (LinkList)malloc(sizeof(Node)); //申请新的结点
s->data = x;
r->next=s;
r=s;
printf("s结点的数据:%d \n",s->data);
scanf("%d",&x);
}
r->next =NULL;
return l;
}
//数据固化
LinkList datasolid()
{
Node *l,*r; //r为新增 的表尾指针
l= Link_init(); //初始化链表
r=l;
int x[9]={
11,22,33,44,55,66,0
};
printf("数据固化中......\n");
int i=0;
while(x[i]!=0)
{
Node *s;
s = (LinkList)malloc(sizeof(Node)); //申请新的结点
s->data = x[i];
r->next=s;
r=s;
i++;
}
r->next =NULL;
return l;
}
//按序号查找结点值
LinkList LocateElemByID(LinkList l,int i)
{
Node *p;
int m=-1;
//判断 i 的合法性
if(i<1 ) printf("位置不合法!\n");
for(p=l;p->next != NULL;p =p->next)
{
m++;
if(m==i)
{
return p;
break;
}
}
if(p->next ==NULL){
printf("没有这个位置!!\n");
return NULL;
}
}
//按值查找结点值
LinkList LocateElemByData(LinkList l,int i)
{
//遍历链表
Node *p;
for(p=l;p!=NULL;p=p->next)
{
if(p->data==i)
{
printf("找到了这个元素!");
return p; break;
}
}
if(p->next ==NULL) printf("没有这个元素!!\n"); return NULL;
}
LinkList Link_add(LinkList l,int i) //插入到第i个位置上
{
//先得到 i-1 个结点
Node *m,*p;
m = LocateElemByID(l,i-1);
p= (LinkList)malloc(sizeof(Node)); //申请新的结点
printf("请输入新加入结点的值:\n");
scanf("%d",&p->data);
p->next =m->next;
m->next =p;
}
//删除结点操作
LinkList Link_delete(LinkList l,int i)
{
//先得到第 i-1个结点
Node *m,*p; //m为i-1结点,p为i结点
m = LocateElemByID(l,i-1);
p=m->next;
m->next=p->next;
free(p);
return l;
}
//求表长操作
int GetLength(LinkList l)
{
Node *p;
int i=-1;
for(p=l;p!=NULL;p=p->next)
{
i++;
}
return i;
}
单链表
最新推荐文章于 2023-05-06 22:43:40 发布