#includestdio.h
創(chuàng)新互聯(lián)建站主營徽縣網(wǎng)站建設(shè)的網(wǎng)絡(luò)公司,主營網(wǎng)站建設(shè)方案,成都App定制開發(fā),徽縣h5成都小程序開發(fā)搭建,徽縣網(wǎng)站營銷推廣歡迎徽縣等地區(qū)企業(yè)咨詢
#includewindows.h
#include stdio.h
#include malloc.h
#include stdlib.h
//定義數(shù)據(jù)類型名稱
typedef int DataType;
#define flag -1?? ??? ?//定義數(shù)據(jù)輸入結(jié)束的標(biāo)志數(shù)據(jù)
//單鏈表結(jié)點(diǎn)存儲結(jié)構(gòu)定義
typedef struct Node
{
DataType data;
struct Node *next;
}LNode ,*LinkList;
//建立單鏈表子函數(shù)
LNode *Create_LinkList()
{
LNode *s,*head,*L;int i=0,x;?? ??? ?//定義指向當(dāng)前插入元素的指針
while(1)
{
scanf("%d",x);
if(-1==x)
{?? return head;
break;}
s= (LNode *)malloc(sizeof(LNode));?? ??? ?//為當(dāng)前插入元素的指針分配地址空間
s-data =x;
s-next =NULL;
i++;
if(i==1)
head=s;
else
L-next =s;
L=s;
}
}
//查找子函數(shù)(按序號查找)
LNode *Get_LinkList(LinkList L,int i)
{
LNode *p;
int j;?? ??? ?//j是計(jì)數(shù)器,用來判斷當(dāng)前的結(jié)點(diǎn)是否是第i個(gè)結(jié)點(diǎn)
p=L;
j=1;
while(p!=NULLji)
{
p=p-next ;?? ??? ?//當(dāng)前結(jié)點(diǎn)p不是第i個(gè)且p非空,則p移向下一個(gè)結(jié)點(diǎn)
j++;
}
return p;
}
//插入運(yùn)算子函數(shù)
void Insert_LinkList(LinkList L,int i,DataType x)?? ??? ?//在單鏈表L中第i個(gè)位置插入值為x的新結(jié)點(diǎn)
{
LNode *p,*s;
p =Get_LinkList(L,i);?? ??? ?//尋找鏈表的第i-1個(gè)位置結(jié)點(diǎn)
if(p==NULL)
{
printf("插入位置不合法!");
exit(-1);
}
else
{
s= (LinkList)malloc(sizeof(LNode));?? ??? ?//為當(dāng)前插入元素的指針分配地址空間
s-data =x;
s-next =p-next ;
p-next =s;
}
}
//單鏈表的刪除運(yùn)算子函數(shù)
void Delete_LinkList(LinkList L,int i)?? ??? ?//刪除單鏈表上的第i個(gè)結(jié)點(diǎn)
{
LNode *p,*q;
p=Get_LinkList(L,i-1);?? ??? ?//尋找鏈表的第i-1個(gè)位置結(jié)點(diǎn)
if(p==NULL)
{
printf("刪除的位置不合法!");?? ??? ?//第i個(gè)結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)不存在,不能執(zhí)行刪除操作
exit(-1);
}
else
{
if(p-next ==NULL)
{
?printf("刪除的位置不合法!");?? ??? ?//第i個(gè)結(jié)點(diǎn)不存在,不能執(zhí)行刪除操作
?exit(-1);
}
else
{
?q=p-next ;
?p-next =p-next-next;
?free(q);
}
}
}
//求表長運(yùn)算子函數(shù)
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("**創(chuàng)建**********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("請輸入選項(xiàng):");
scanf("%d",i);
switch(i)
{
case 1:head=Create_LinkList(); getchar();break;
case 2:printf("請輸入位置和數(shù)據(jù);");
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;
}
}
}
我把創(chuàng)建給改了一下
#include stdio.h
#include malloc.h
int m;
struct Node
{
int data;
struct Node *next;
}* listA, *listB;
//打印AList列表
//參數(shù)AList為顯示的列表
void printList(struct Node *AList)
{
struct Node *post;
post = AList-next;
while (post)
{
printf("%d ",post-data);
post = post-next;
}
printf("\n");
}
//初始化表頭,列表含有表頭
//參數(shù)AList為初始化的列表
void init(struct Node **AList)
{
*AList = (struct Node*)malloc(sizeof(struct Node));
(*AList)-data = 0;
(*AList)-next = 0;
}
//創(chuàng)建列表
//參數(shù)AList為要?jiǎng)?chuàng)建的列表
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個(gè)節(jié)點(diǎn)值為:", i);
scanf("%d", post-data);
post-next = 0;
pre-next = post;
pre = post;
}
}
//插入節(jié)點(diǎn)
//參數(shù)AList為要插入的列表
//參數(shù)Aindex為要插入的節(jié)點(diǎn)的位置
void InsertNode(struct Node **AList, int Aindex = -1)
{
int i;
struct Node *pre, *post;
pre = *AList;
//判斷插入位置,默認(rèn)為頭部插入
if((Aindex0) (Aindex=m))
{
post = (struct Node*)malloc(sizeof(struct Node));
printf("請輸入要插入的節(jié)點(diǎn)值為:");
printf("listN%d = ", Aindex);
scanf("%d", post-data);
post-next = 0;
//尋找插入點(diǎn)
i = 1;
pre = *AList;
while ( iAindex )
{
pre = pre-next;
i = i + 1;
}
//插入節(jié)點(diǎn)
post-next = pre-next;
pre-next = post;
}
else //插入到頭部
{
post = (struct Node*)malloc(sizeof(struct Node));
printf("listA1 = ");
scanf("%d", post-data);
post-next = 0;
//插入節(jié)點(diǎn)
post-next = pre-next;
pre-next = post;
}
m = m + 1;
}
//刪除節(jié)點(diǎn)
//參數(shù)AList為要?jiǎng)h除的列表
//參數(shù)Aindex為要?jiǎng)h除的節(jié)點(diǎn)的位置
void DeleteNode(struct Node **AList, int Aindex)
{
int i;
struct Node *pre, *post;
pre = *AList;
//判斷刪除位置
if((Aindex0) (Aindex=m))
{
//尋找刪除點(diǎn)
i = 1;
while ( iAindex )
{
pre = pre-next;
i = i + 1;
}
//賦值要?jiǎng)h除節(jié)點(diǎn)
post = pre-next;
pre-next = post-next;
delete post;
m = m - 1;
}
else //輸入越界
{
printf("不存在此節(jié)點(diǎn)");
}
}
//列表存盤
//參數(shù)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;
}
//使用文件創(chuàng)建列表
//參數(shù)AList為要?jiǎng)?chuàng)建的列表
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使用輸入創(chuàng)建
//listB使用讀取文件創(chuàng)建
init(listA);
init(listB);
ReadList(listA);
printf("輸入的列表為:");
printList(listA);
InsertNode(listA, 1);
printf("插入第一個(gè)節(jié)點(diǎn)后的列表為:");
printList(listA);
DeleteNode(listA, 2);
printf("刪除第二個(gè)節(jié)點(diǎn)后的列表為:");
printList(listA);
WriteFile(listA);
ReadFile(listB);
printf("使用文件創(chuàng)建的列表為:");
printList(listB);
}
以上程序可以直接運(yùn)行,且結(jié)果正確。
主函數(shù)可以再做的復(fù)雜一些和友好一些。刪除節(jié)點(diǎn)的位置和插入節(jié)點(diǎn)的位置可以作為輸入之類的。
希望對你有所幫助
link *creat(int n) //鏈表建立 n為長度
{
link *p,*p0;
top=(link*)malloc(sizeof(link));
printf("輸入數(shù)據(jù) ");
scanf("%d",top-n);
top-next=NULL;
p0=top;
while(--n)
{
p=(link*)malloc(sizeof(link));
printf("輸入數(shù)據(jù) ");
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);
}