重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
#includestdio.h
创新互联建站主营徽县网站建设的网络公司,主营网站建设方案,成都App定制开发,徽县h5成都小程序开发搭建,徽县网站营销推广欢迎徽县等地区企业咨询
#includewindows.h
#include stdio.h
#include malloc.h
#include stdlib.h
//定义数据类型名称
typedef int DataType;
#define flag -1 //定义数据输入结束的标志数据
//单链表结点存储结构定义
typedef struct Node
{
DataType data;
struct Node *next;
}LNode ,*LinkList;
//建立单链表子函数
LNode *Create_LinkList()
{
LNode *s,*head,*L;int i=0,x; //定义指向当前插入元素的指针
while(1)
{
scanf("%d",x);
if(-1==x)
{ return head;
break;}
s= (LNode *)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间
s-data =x;
s-next =NULL;
i++;
if(i==1)
head=s;
else
L-next =s;
L=s;
}
}
//查找子函数(按序号查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j; //j是计数器,用来判断当前的结点是否是第i个结点
p=L;
j=1;
while(p!=NULLji)
{
p=p-next ; //当前结点p不是第i个且p非空,则p移向下一个结点
j++;
}
return p;
}
//插入运算子函数
void Insert_LinkList(LinkList L,int i,DataType x) //在单链表L中第i个位置插入值为x的新结点
{
LNode *p,*s;
p =Get_LinkList(L,i); //寻找链表的第i-1个位置结点
if(p==NULL)
{
printf("插入位置不合法!");
exit(-1);
}
else
{
s= (LinkList)malloc(sizeof(LNode)); //为当前插入元素的指针分配地址空间
s-data =x;
s-next =p-next ;
p-next =s;
}
}
//单链表的删除运算子函数
void Delete_LinkList(LinkList L,int i) //删除单链表上的第i个结点
{
LNode *p,*q;
p=Get_LinkList(L,i-1); //寻找链表的第i-1个位置结点
if(p==NULL)
{
printf("删除的位置不合法!"); //第i个结点的前驱结点不存在,不能执行删除操作
exit(-1);
}
else
{
if(p-next ==NULL)
{
printf("删除的位置不合法!"); //第i个结点不存在,不能执行删除操作
exit(-1);
}
else
{
q=p-next ;
p-next =p-next-next;
free(q);
}
}
}
//求表长运算子函数
int Length_LinkList(LinkList L)
{
int l; //l记录L的表长
LNode *p;
p=L;
l=1;
while(p-next)
{
p=p-next;
l++;
}
return l;
}
int main ()
{
LNode *head,*p;
head=(LinkList)malloc(sizeof(LNode));
int x,y;
a:
printf("*******menu*******\n");
printf("**创建**********1*\n");
printf("**插入**********2*\n");
printf("**删除**********3*\n");
printf("**表长**********4*\n");
printf("**清屏**********5*\n");
printf("**打印**********6*\n");
printf("**退出******other*\n");
printf("******************\n");
int i=1;
while(i)
{
printf("请输入选项:");
scanf("%d",i);
switch(i)
{
case 1:head=Create_LinkList(); getchar();break;
case 2:printf("请输入位置和数据;");
scanf("%d%d",x,y);
Insert_LinkList(head,x,y);break;
case 3:printf("请输入位置;");
scanf("%d",x);
Delete_LinkList(head,x);break;
case 4:printf("%d",Length_LinkList(head));break;
case 5:system("cls");goto a;
case 6:p=head;
while(p!=NULL)
{printf("%d\n",p-data);
p=p-next;}
break;
default :i=0;
}
}
}
我把创建给改了一下
#include stdio.h
#include malloc.h
int m;
struct Node
{
int data;
struct Node *next;
}* listA, *listB;
//打印AList列表
//参数AList为显示的列表
void printList(struct Node *AList)
{
struct Node *post;
post = AList-next;
while (post)
{
printf("%d ",post-data);
post = post-next;
}
printf("\n");
}
//初始化表头,列表含有表头
//参数AList为初始化的列表
void init(struct Node **AList)
{
*AList = (struct Node*)malloc(sizeof(struct Node));
(*AList)-data = 0;
(*AList)-next = 0;
}
//创建列表
//参数AList为要创建的列表
void ReadList(struct Node **AList)
{
int i;
struct Node *post;
struct Node *pre;
// 输入列表长度
printf("请输入列表的长度为:"); scanf("%d",m);
//读取列表A
pre = *AList;
for(i=1; i=m; i++)
{
post = (struct Node*)malloc(sizeof(struct Node));
printf("第%d个节点值为:", i);
scanf("%d", post-data);
post-next = 0;
pre-next = post;
pre = post;
}
}
//插入节点
//参数AList为要插入的列表
//参数Aindex为要插入的节点的位置
void InsertNode(struct Node **AList, int Aindex = -1)
{
int i;
struct Node *pre, *post;
pre = *AList;
//判断插入位置,默认为头部插入
if((Aindex0) (Aindex=m))
{
post = (struct Node*)malloc(sizeof(struct Node));
printf("请输入要插入的节点值为:");
printf("listN%d = ", Aindex);
scanf("%d", post-data);
post-next = 0;
//寻找插入点
i = 1;
pre = *AList;
while ( iAindex )
{
pre = pre-next;
i = i + 1;
}
//插入节点
post-next = pre-next;
pre-next = post;
}
else //插入到头部
{
post = (struct Node*)malloc(sizeof(struct Node));
printf("listA1 = ");
scanf("%d", post-data);
post-next = 0;
//插入节点
post-next = pre-next;
pre-next = post;
}
m = m + 1;
}
//删除节点
//参数AList为要删除的列表
//参数Aindex为要删除的节点的位置
void DeleteNode(struct Node **AList, int Aindex)
{
int i;
struct Node *pre, *post;
pre = *AList;
//判断删除位置
if((Aindex0) (Aindex=m))
{
//寻找删除点
i = 1;
while ( iAindex )
{
pre = pre-next;
i = i + 1;
}
//赋值要删除节点
post = pre-next;
pre-next = post-next;
delete post;
m = m - 1;
}
else //输入越界
{
printf("不存在此节点");
}
}
//列表存盘
//参数AList为要存盘的列表
int WriteFile(struct Node *AList)
{
struct Node *post;
FILE *fd;
fd = fopen("data.txt", "wt");
if (fd == NULL)
{
printf("File open error");
return 0;
}
post = AList-next;
while (post)
{
fprintf(fd, "%d ", post-data);
post = post-next;
}
fclose(fd);
return 1;
}
//使用文件创建列表
//参数AList为要创建的列表
int ReadFile(struct Node **AList)
{
struct Node *pre, *post;
FILE *fd;
fd = fopen("data.txt", "rb");
if (fd == NULL)
{
printf("File open error");
return 0;
}
//读取列表
pre = *AList;
while (!feof(fd))
{
post = (struct Node*)malloc(sizeof(struct Node));
fscanf(fd, "%d ", post-data);
post-next = 0;
pre-next = post;
pre = post;
}
fclose(fd);
return 1;
}
void main(void)
{
//listA使用输入创建
//listB使用读取文件创建
init(listA);
init(listB);
ReadList(listA);
printf("输入的列表为:");
printList(listA);
InsertNode(listA, 1);
printf("插入第一个节点后的列表为:");
printList(listA);
DeleteNode(listA, 2);
printf("删除第二个节点后的列表为:");
printList(listA);
WriteFile(listA);
ReadFile(listB);
printf("使用文件创建的列表为:");
printList(listB);
}
以上程序可以直接运行,且结果正确。
主函数可以再做的复杂一些和友好一些。删除节点的位置和插入节点的位置可以作为输入之类的。
希望对你有所帮助
link *creat(int n) //链表建立 n为长度
{
link *p,*p0;
top=(link*)malloc(sizeof(link));
printf("输入数据 ");
scanf("%d",top-n);
top-next=NULL;
p0=top;
while(--n)
{
p=(link*)malloc(sizeof(link));
printf("输入数据 ");
scanf("%d",p-n);
p0-next=p;
p-next=NULL;
p0=p;
}
return top;
}
void inlink(int n,link *p0,link *p) //插入 p q之间
{
link *r;
r=(link*)malloc(sizeof(link));
r-n=n;
r-next=p;
p0-next=r;
p0=r;
}
void printl(link *head) //输出
{
link *p0,*p;
p=head;
while(p!=NULL)
{
p0=p;
printf("%d\n",p-n);
p=p-next;
}
}
void remov(link *p0,link *p) 删除
{
p0-next=p-next;
free(p);
}