㈠ 用C语言实现对单链表的基本操作
#include<stdio.h>
#include<stdlib.h>
typedefintDataType;
typedefstructnode{
DataTypemember;
structnode*next;
}*LinkList,*pNode;
//初始化链表
LinkListGetEmptyList(){
LinkListhead=(pNode)malloc(sizeof(structnode));
head->member=0;
head->next=NULL;
returnhead;
}
//在非增链表中插入结点
voidInsertNode(LinkListhead,DataTypex){
pNodep,q;
for(p=head;p->next!=NULL;p=p->next){
if(p->next->member<=x){
q=(pNode)malloc(sizeof(structnode));
q->member=x;
q->next=p->next;
p->next=q;
return;
}
}
q=(pNode)malloc(sizeof(structnode));
q->member=x;
q->next=p->next;
p->next=q;
}
//新结点插入为首结点
voidPushNode(LinkListhead,DataTypex){
pNodep=(pNode)malloc(sizeof(structnode));
p->member=x;
p->next=head->next;
head->next=p;
}
//删除结点
intDeleteNode(LinkListhead,DataTypex){
pNodep,q;
for(p=head;p!=NULL;p=p->next){
if(p->next->member==x){
q=p->next;
p->next=q->next;
free(q);
return1;//成功删除member(第一个)为x的结点
}
}
return0;//没有找到member为x的结点
}
//查找结点
intFindNode(LinkListhead,DataTypex){
pNodep;
for(p=head->next;p!=NULL;p=p->next){
if(p->member==x)return1;//找到了
}
return0;//没有找到
}
//销毁链表
voidDestroyList(LinkListhead){
pNodeq,p=head;
while(p){
q=p;
p=q->next;
free(q);
}
head=NULL;
}
//遍历链表
voidShowList(LinkListhead){
pNodep=head->next;
while(p!=NULL){
printf("%d",p->member);
p=p->next;
}
printf(" ");
}
intmain(){
DataTypex,res;
LinkListhead=GetEmptyList();
printf("输入一个整数('q'toquit):");
while(scanf("%d",&x)==1){
InsertNode(head,x);//创建非增链表
printf("输入一个整数('q'toquit):");
}
fflush(stdin);
ShowList(head);
printf("输入待查找的整数:");
scanf("%d",&x);
res=FindNode(head,x);
if(res)printf("找到了。 ");
elseprintf("没找到! ");
printf("输入待删除的整数:");
scanf("%d",&x);
res=DeleteNode(head,x);
if(res)printf("成功删除。 ");
elseprintf("没找到数据为:%d的结点! ",x);
ShowList(head);
DestroyList(head);
return0;
}
㈡ 求解c语言这个单链表程序,越简单越好
//函数种类
/* void dakai(int n,int j,char ch);
void save(int n,char ch);
void display(int n,char ch);//显示信息
void xiugai();
void dakai(int n,int j,char ch);//查找文件
void shuru(int n,char ch);//输入信息
void paixu(int n,char ch);
void xuanzhe(int n,char ch);//选择运行程序*/
//-------------------------------------------------------------------------------
struct student_type//定义结构体
{
char name[10];
int num;
int age;
char addr[15];
}stud[SIZE];
//-----------------------------------------------------------------------------------------
void save(int n,char ch)//保存输入信息
{
FILE *fp;
int i;
if((fp=fopen("f:\\stu_list.txt","wb+"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
for(i=0;i<n;i++)
if(fwrite(&stud[i],sizeof(student_type),1,fp)!=1)
printf("file write error\n");
fclose(fp);
}
//------------------------------------------------------------------------------------------
void display(int n,char ch)//显示信息
{
FILE *fp;
int i;
if((fp=fopen("f:\\stu_list.txt","rb"))==NULL)
{
printf("cannot open file\n");
exit(0);
}
for(i=0;i<n;i++)
{
fread(&stud[i],sizeof(struct student_type),1,fp);
printf("姓名:%-10s学号:%4d年龄:%4d地址:%-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
fclose(fp);
}
//--------------------------------------------------------------------------------------------
void xiugai(int n,char ch)//修改学生信息
{
int z;
FILE *pf;
pf=fopen("f:\\stu_list.txt","rb+");
if(pf==NULL)
{
printf("\n pf open Error,\n exit program.");
return;
}
else
{
//输入学生信息
cout<<"请输入你要修改的学号:"<<endl;
cin>>z;
fseek(pf,z*sizeof(struct student_type),2);
scanf("%s%d%d%s",stud[z].name,&stud[z].num,&stud[z].age,stud[z].addr);
fseek(pf,sizeof(struct student_type),0);
fwrite(&stud,sizeof(struct student_type),1,pf);
}
fclose(pf);
//save(n,ch);
//display(n,ch);
}
//-----------------------------------------------------------------------------------------------
/* struct stud
{
int num;
struct studt;
} *head;
void printnode(stud
{
while(p->next!=NULL)
{
//输出p指向的数据
cout<<p->num<<" ";
p=p->next;//指向下一个
}
cout<<p->num<<endl;
}
//---------------------------------------------------------------------------------------------
void dakai2()
{
node *p=new node;
head=p;//设置头指针
p->num=90;
for(int k=1;k<10;k++)
{
//产生下一个结点1
p->next=p+k;
p=p->next;
p->num=k*100;
}
p->next=NULL;
printnode(head);
}*/
//------------------------------------------------------------------------------------------------
void dakai(int n,int j,char ch)//查找文件
{
//int i=2;
//char ch1,filename[20];
FILE *fp;
//int i=0;
//display(n,ch);
//cout<<"请输入所要查找的文件名,以'#'结束输入"<<endl;
//scanf("%s",filename);
cout<<"---------------------------------------------------------------------------"<<endl;
if ((fp=fopen("f:\\stu_list.txt","rb"))==NULL)
{
printf("cannot open this file\n");
exit(0);
}
for(int i=0;i<4;i+=1)
{
fseek(fp,i*sizeof(struct student_type),2);
fread(&stud[i],sizeof(struct student_type),1,fp);
if(stud[i].num==j)
//{
printf("姓名:%-10s学号:%4d年龄:%4d地址:%-15s\n",stud[i].name,stud[i].num,stud[i].age,stud[i].addr);
}
//i++;
//}
// }
/*fread(&stud[i-1],sizeof(struct student_type),i,fp);
cout<<"姓名";
printf("%-10s",stud[i-1].name);
cout<<"学号";
printf("%4d",stud[i-1].num);
cout<<"年龄";
printf("%4d",stud[i-1].age);
cout<<"地址";
printf("%-15s\n",stud[i-1].addr);
// }
/*
while((ch=getchar())!='#')
{
fputc(ch,fp);
putchar(ch);
}*/
fclose(fp);
}
//----------------------------------------------------------------------------------------------------------
void shuru(int n,char ch)//输入信息
{
int i;
cout<<"现在请输入学生个数:";
cin>>n;
cout<<"现在请输入"<<n<<"个学生的信息:"<<endl;
for(i=0;i<n;i++)
{
cout<<"请输入第"<<i+1<<"个学生的姓名,学号,年龄,地址:"<<endl;
scanf("%s%d%d%s",stud[i].name,&stud[i].num,&stud[i].age,stud[i].addr);
}
save(n,ch);
display(n,ch);
}
//----------------------------------------------------------------------------------------------------------
void paixu(int n,char ch)
{
fstream outfile,infile;
infile.open("f:\\stu_list.txt",ios::in);
if(!infile)
{
cerr<<"文件打开失败!"<<endl;
exit(0);
}
student_type textline[80];
// int i=0;
// while(!infile.eof())
// {
// i++;
// infile.getline(textline,sizeof(textline));
// if
//cout<<i<<":"<<textline<<endl;
}
infile.close();
}
//-------------------------------------------------------------------------------------------------------
/* void paixu2()
{
student_type ww;
for(int i=0;i<n;i++)
{
for(int j=i+1;j<n;j++)
{
if(stud[i].num>stu[j].num)
{
ww.num=stud[i].num;
stud[i].num=stud[j].num;
stud[j].num=ww.num;
ww.
*/
//-----------------------------------------------------------------------------------------------------------
void xuanzhe(int n,char ch)//选择运行程序
{
int i,j;
if(ch=='s')//输入
{
shuru(n,ch);
cout<<"---------------------------------------------------------------------"<<endl;
cout<<" 请输入命令"<<endl<<endl;
cout<<"s(输入信息)、f(查找信息)、d(删除)、p(排序)、a(存储信息)按其他键退出"<<endl;
cin>>ch;
xuanzhe(n,ch);
}
else if(ch=='f')//查找
{
cout<<"请输入要查找的编号:"<<endl;
cin>>j;
dakai(n,j,ch);
cout<<"---------------------------------------------------------------------"<<endl;
cout<<" 请输入命令"<<endl<<endl;
cout<<"s(输入信息)、f(查找信息)、d(删除)、p(排序)、a(存储信息)按其他键退出"<<endl;
cin>>ch;
xuanzhe(n,ch);
}
else if(ch=='a')//保存
{
save(n,ch);
cout<<"---------------------------------------------------------------------"<<endl;
cout<<" 请输入命令"<<endl<<endl;
cout<<"s(输入信息)、f(查找信息)、d(删除)、p(排序)、a(存储信息)按其他键退出"<<endl;
cin>>ch;
xuanzhe(n,ch);
}
else if(ch=='p')
{
paixu(n,ch);
cout<<"---------------------------------------------------------------------"<<endl;
cout<<" 请输入命令"<<endl<<endl;
cout<<"s(输入信息)、f(查找信息)、d(删除)、p(排序)、a(存储信息)按其他键退出"<<endl;
cin>>ch;
xuanzhe(n,ch);
}
else if(ch=='x')//修改
{
xiugai(n,ch);
cout<<"------------------------------------------------------------------------"<<endl;
cout<<"s(输入信息)、f(查找信息)、d(删除)、p(排序)、a(存储信息)按其他键退出"<<endl;
cin>>ch;
xuanzhe(n,ch);
}
else if(ch=='d')
{
display(n,ch);//显示信息
cout<<"------------------------------------------------------------------------"<<endl;
cout<<"s(输入信息)、f(查找信息)、d(删除)、p(排序)、a(存储信息)按其他键退出"<<endl;
cin>>ch;
xuanzhe(n,ch);
}
else
{
cout<<"命令错误!"<<endl;
}
}
//--------------------------------------------------------------------------------------------------
void main()//主函数
{
int n;
char ch;
cout<<"---------------------------------------------------------------------"<<endl;
cout<<" 请输入命令"<<endl;
cout<<"s(输入信息)、f(查找信息)、d(删除)、p(排序)、a(存储信息)按其他键退出"<<endl;
cin>>ch;
xuanzhe(n,ch);
}
㈢ C语言怎么动态生成单循环链表
在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。
链表的C语言实现之循环链表及双向链表
一、循环链表
循环链表是与单链表一样,是一种链式的存储结构,所不同的是,循环链表的最后一个结点的指针是指向该循环链表的第一个结点或者表头结点,从而构成一个环形的链。
循环链表的运算与单链表的运算基本一致。所不同的有以下几点:
1、在建立一个循环链表时,必须使其最后一个结点的指针指向表头结点,而不是象单链表那样置为NULL.此种情况还使用于在最后一个结点后插入一个新的结点。
2、在判断是否到表尾时,是判断该结点链域的值是否是表头结点,当链域值等于表头指针时,说明已到表尾。而非象单链表那样判断链域值是否为NULL.
二、双向链表
双向链表其实是单链表的改进。
当我们对单链表进行操作时,有时你要对某个结点的直接前驱进行操作时,又必须从表头开始查找。这是由单链表结点的结构所限制的。因为单链表每个结点只有一个存储直接后继结点地址的链域,那么能不能定义一个既有存储直接后继结点地址的链域,又有存储直接前驱结点地址的链域的这样一个双链域结点结构呢?这就是双向链表。
在双向链表中,结点除含有数据域外,还有两个链域,一个存储直接后继结点地址,一般称之为右链域;一个存储直接前驱结点地址,一般称之为左链域。
㈣ 急~~~功能是单链表的修改,C语言怎么写
你想怎么修改?插入、删除元素还是修改某个元素的值?
下面的程序我特意改的,实现了检查某个元素的值和修改某个元素的值,两个功能,已经调试过,可以直接运行的了。如果你还想要添加其他功能,比如插入、删除等等,你再给个回复,我给你写。
#include<malloc.h>
#include<stdio.h>
#include<stdlib.h>
#include<iostream.h>
typedef struct LNode{
long data;
struct LNode *next;
}LNode;
LNode *Init_L(LNode *L)
{//建空链表L
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
return L;
}
int len_L(LNode *L)
{//求L链表中节点的个数
int len=0;
LNode *p;
p=L->next;
while(p!=NULL)
{
++len;
p=p->next;
}
printf("该链表的长度:%d\n\n",len);
return len;
}
LNode *creat_L(LNode *L)
{//创建线性表L
int i,n;LNode *q;
do{
printf("创建表:\n");
printf("表的元素个数:");
scanf("%d",&n);
LNode *p;
L=(LNode *)malloc(sizeof(LNode));
L->next=NULL;
q=L;
for(i=1;i<=n;++i)
{
p=(LNode *)malloc(sizeof(LNode));
printf("请输入第 %d 个数:",i);
scanf("%d",&p->data );
q->next =p;
q=q->next;q->next=NULL;
}
printf("\n创建成功!!!\n\n");
printf("想重新创建该表吗?( 若选择其它代表退出!!!)(Y:0/N:1) ");
scanf("%d",&i);
printf("\n");
}while(i==0);
return L;
}
void printf_L(LNode *L)
{//打印线性表L
LNode *p;
p=L;
printf("输出该链表:\n");
if(p->next!=NULL)
do
{
printf("%d ",p->next->data);
p=p->next;
}while(p->next!=NULL);
printf("\n\n");
}
void check_L(LNode *L)
{//检查L链表中第k个元素或这改变其内容
int i,j,k,len;
int c;
do
{
printf("请输入检查的节点位置:");
scanf("%d",&k);
len=len_L(L);
if(k>len) printf("错误!!!\n\n");
}while(k>len);
LNode *p;
p=L;
for(i=1;i<=k;i++)
{
p=p->next ;
}
do
{
printf("1.检查第%d个节点的内容;\n",k);
printf("2.改变第%d个节点的内容:\n",k);
printf("( 若选择其它代表退出!!!)\n\n");
printf("请选择您要实现的功能: ");
scanf("%d",&j);
switch(j)
{
case 1: printf("其内容为: %d\n\n",p->data);break;
case 2: printf("请输入改变后的内容:");
scanf("%d",&p->data);
printf("您想检查结果吗?(Y:0/N:1)");
scanf("%d",&i);
if(i==0) printf_L(L);
break;
}
printf("您想继续检查吗(y:0/n:1)? ");
scanf("%d",&c);
}while(c==0);
return;
}
void main()
{
int t,n,k=2,i=2,v,j=7,len;
LNode *A,*B,*C,*D,*E,*F,*SUM,*SUB,*UNION;
A=creat_L(A);
check_L(A);
}
㈤ 怎么用C语言更新mysql中的数据
更改数据库值 和语言关系不大,这是对数据库的操作 你只需按照mysql 操作方法 update `表` set `字段`=`新值` where 条件 如 `id`=1 ; 就可以更改数据库内某个指定的值了。至于怎么显示 怎么赋值 那些才是语言的事情,只要对数据库数据的操作 都是 数据库的事情
㈥ 数据结构单链表用c语言如何实现
# include<stdio.h>
# include<stdlib.h>
typedef int datatype;
typedef struct node{
datatype data;
struct node *next;
}LinkList;
LinkList *head,*p,*s;
int i,j,x,count,length,choices;
LinkList (*CreatList)()//创建单链表
{
int t;
LinkList *r;
head=(LinkList*)malloc(sizeof(LinkList));
r=head;
scanf("%d",&t);
while(t!=-1){
s=(LinkList*)malloc(sizeof(LinkList));
s->data=t;
r->next=s;
r=s;
scanf("%d",&t);
}
r->next=NULL;
return head;
}
LinkList DispList(LinkList *head)//输出单链表
{
for(p=head->next;p;p=p->next)
printf("%5d",p->data);
printf("\n");
}
int ListLength(LinkList *head)//计算单链表长度并输出
{
length=0;
p=head->next;
while(p!=NULL){
p=p->next;
length++;
}
printf("%5d\n",length);
}
LinkList GetElem(LinkList *head,int i)//查找某一元素并输出
{
j=0;
LinkList *p;
p=head;
scanf("%d",&i);
while((p->next!=NULL)&&(j<i)){
p=p->next;
j++;
}
if(i==j) printf("%5d\n",p->data);
else printf("NULL\n");
}
LinkList LocateElem(LinkList *head,int x)//查找某一元素的位置并输出
{
p=head->next;
count=1;
scanf("%d",&x);
while(p!=NULL){
if(p->data!=x){p=p->next; count++;}
else break;
}
if(count<=length) printf("%5d\n",count);
else printf("error\n");
}
LinkList ListInsert(LinkList *head,int i,datatype x)//在某一位置插入某一元素
{
j=1;
p=head->next;
s=(LinkList*)malloc(sizeof(LinkList));
scanf("%d%d",&i,&x);
while(j<i-1&&p!=NULL){
p=p->next;
j++;
}
s->data=x;
s->next=p->next;
p->next=s;
DispList(head);
ListLength(head);
}
LinkList ListDelete(LinkList *head,int i)//删除某一位置的元素
{
j=1;
p=head->next;
scanf("%d",&i);
while(j<i-1){
p=p->next;
j++;
}
s=p->next;
p->next=s->next;
free(s);
DispList(head);
ListLength(head);
}
int DestroyList(LinkList*head)//释放单链表
{
p=head->next;
while(p->next!=NULL){
s=p;
p=p->next;
free(s);
}
head=NULL;
return 0;
}
int main(void)
{
printf("0:创建单链表\n1:输出单链表\n2:计算单链表长度并输出\n3:查找某一元素并输出\n");
printf("4:查找某一元素的位置并输出\n5:在某一位置插入某一元素\n6:删除某一位置的元素\n7:释放单链表\n");
printf("说明:创建单链表以-1结束。\n该程序的释放有点问题,但可以当清空单链表来用。\n请选择:");
while(scanf("%d",&choices)){
switch(choices){
case 0:CreatList();break;//创建单链表
case 1:DispList(head);break;//输出单链表
case 2:ListLength(head);break;//计算单链表长度并输出
case 3:GetElem(head,i);break;//查找某一元素并输出
case 4:LocateElem(head,x);break;//查找某一元素的位置并输出
case 5:ListInsert(head,i,x);break;//在某一位置插入某一元素
case 6:ListDelete(head,i);break;//删除某一位置的元素
case 7:DestroyList(head);printf("该程序释放后不能选择输出");break;//释放单链表
}
printf("请选择:");
}
return 0;
}
㈦ 单链表的C语言实现
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct lnode
{ int data;
struct lnode *next;
}lnode,*linklist; /*结点定义*/
void main()
{
void creatlist(linklist &lnode,int y); /*函数声明*/
int n,i;
lnode *l,*p;
l=(linklist)malloc(sizeof(lnode)); /*生成头结点*/
if(l==NULL) /*错误检测*/
{
printf("can't get space!");
return; //1
}
p=l; /*p和l都指示头结点*/
l->next=NULL;
printf("input n=\n");
scanf("%d",&n); /*n为结点个数*/
creatlist(l,n ); /*生成单链表*/
for(p=p->next;p!=NULL;p=p->next) /*将链表输出,目的是检验链表是否已经生成*/ //修改
{
printf("%d ",p->data);
}
}
void creatlist(linklist &lnode,int y) /*子函数*/
{
linklist s;
int i;
for(i=0;i<y;i++) //y吧 //修改
{
s=(linklist)malloc(sizeof(lnode));
if(s==NULL) /*错误检测*/
{
printf("can't get space!");
break;
}
scanf("%d",&(s->data)); /*输入结点数据*/
s->next=lnode->next; /*头插法*/ //修改
lnode->next=s; //修改
}
}
㈧ C语言单链表 求大神教教怎么修改
#include<stdio.h>
#include<stdlib.h>
typedefstructnode
{
intdata;
structnode*next;
}node;
intmain(void){
intnum;
node*p,*head;
head=NULL;
do{
scanf("%d",&num);
if(num!=-1)
{
p=(node*)malloc(sizeof(node));
p->data=num;
p->next=NULL;
if(head==NULL)
head=p;
else
p->next=head;
head=p;
}
}while(num!=-1);
while(p!=NULL){
printf("%d",p->data);
p=p->next;
}
printf(" ");
return0;
}
已经修改好了,有问题如果问错在哪可以追问
㈨ 数据结构单链表实验(c语言版)
正好我大二的实验还在。。。但是还是想说一句,伸手党不适合做IT,建议楼主还是要自己多加练习,不会可以问,网上有很多乐意帮你解决问题的人。
#include"stdio.h"
#include"string.h"
#include"ctype.h"
#include"stdlib.h"
#include"io.h"
#include"math.h"
#include"time.h"
#defineOK1
#defineERROR0
#defineTRUE1
#defineFALSE0
#defineMAXSIZE20/*存储空间初始分配量*/
typedefintStatus;/*Status是函数的类型,其值是函数结果状态代码,如OK等*/
typedefintElemType;/*ElemType类型根据实际情况而定,这里假设为int*/
Statusvisit(ElemTypec)
{
printf("%d",c);
returnOK;
}
typedefstructNode
{
ElemTypedata;
structNode*next;
}Node;
typedefstructNode*LinkList;/*定义LinkList*/
/*初始化顺序线性表*/
StatusInitList(LinkList*L)
{
*L=(LinkList)malloc(sizeof(Node));/*产生头结点,并使L指向此头结点*/
if(!(*L))/*存储分配失败*/
returnERROR;
(*L)->next=NULL;/*指针域为空*/
returnOK;
}
/*初始条件:顺序线性表L已存在。操作结果:若L为空表,则返回TRUE,否则返回FALSE*/
StatusListEmpty(LinkListL)
{
if(L->next)
returnFALSE;
else
returnTRUE;
}
/*初始条件:顺序线性表L已存在。操作结果:将L重置为空表*/
StatusClearList(LinkList*L)
{
LinkListp,q;
p=(*L)->next;/*p指向第一个结点*/
while(p)/*没到表尾*/
{
q=p->next;
free(p);
p=q;
}
(*L)->next=NULL;/*头结点指针域为空*/
returnOK;
}
/*初始条件:顺序线性表L已存在。操作结果:返回L中数据元素个数*/
intListLength(LinkListL)
{
inti=0;
LinkListp=L->next;/*p指向第一个结点*/
while(p)
{
i++;
p=p->next;
}
returni;
}
/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/
/*操作结果:用e返回L中第i个数据元素的值*/
StatusGetElem(LinkListL,inti,ElemType*e)
{
intj;
LinkListp; /*声明一结点p*/
p=L->next; /*让p指向链表L的第一个结点*/
j=1; /*j为计数器*/
while(p&&j<i)/*p不为空或者计数器j还没有等于i时,循环继续*/
{
p=p->next;/*让p指向下一个结点*/
++j;
}
if(!p||j>i)
returnERROR;/*第i个元素不存在*/
*e=p->data;/*取第i个元素的数据*/
returnOK;
}
/*初始条件:顺序线性表L已存在*/
/*操作结果:返回L中第1个与e满足关系的数据元素的位序。*/
/*若这样的数据元素不存在,则返回值为0*/
intLocateElem(LinkListL,ElemTypee)
{
inti=0;
LinkListp=L->next;
while(p)
{
i++;
if(p->data==e)/*找到这样的数据元素*/
returni;
p=p->next;
}
return0;
}
/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L),*/
/*操作结果:在L中第i个位置之前插入新的数据元素e,L的长度加1*/
StatusListInsert(LinkList*L,inti,ElemTypee)
{
intj;
LinkListp,s;
p=*L;
j=1;
while(p&&j<i)/*寻找第i个结点*/
{
p=p->next;
++j;
}
if(!p||j>i)
returnERROR;/*第i个元素不存在*/
s=(LinkList)malloc(sizeof(Node));/*生成新结点(C语言标准函数)*/
s->data=e;
s->next=p->next;/*将p的后继结点赋值给s的后继*/
p->next=s;/*将s赋值给p的后继*/
returnOK;
}
/*初始条件:顺序线性表L已存在,1≤i≤ListLength(L)*/
/*操作结果:删除L的第i个数据元素,并用e返回其值,L的长度减1*/
StatusListDelete(LinkList*L,inti,ElemType*e)
{
intj;
LinkListp,q;
p=*L;
j=1;
while(p->next&&j<i) /*遍历寻找第i个元素*/
{
p=p->next;
++j;
}
if(!(p->next)||j>i)
returnERROR;/*第i个元素不存在*/
q=p->next;
p->next=q->next; /*将q的后继赋值给p的后继*/
*e=q->data;/*将q结点中的数据给e*/
free(q);/*让系统回收此结点,释放内存*/
returnOK;
}
/*初始条件:顺序线性表L已存在*/
/*操作结果:依次对L的每个数据元素输出*/
StatusListTraverse(LinkListL)
{
LinkListp=L->next;
while(p)
{
visit(p->data);
p=p->next;
}
printf(" ");
returnOK;
}
/*随机产生n个元素的值,建立带表头结点的单链线性表L(头插法)*/
voidCreateListHead(LinkList*L,intn)
{
LinkListp;
inti;
srand(time(0));/*初始化随机数种子*/
*L=(LinkList)malloc(sizeof(Node));
(*L)->next=NULL;/*先建立一个带头结点的单链表*/
for(i=0;i<n;i++)
{
p=(LinkList)malloc(sizeof(Node));/*生成新结点*/
p->data=rand()%100+1;/*随机生成100以内的数字*/
p->next=(*L)->next;
(*L)->next=p; /*插入到表头*/
}
}
/*随机产生n个元素的值,建立带表头结点的单链线性表L(尾插法)*/
voidCreateListTail(LinkList*L,intn)
{
LinkListp,r;
inti;
srand(time(0));/*初始化随机数种子*/
*L=(LinkList)malloc(sizeof(Node));/*L为整个线性表*/
r=*L;/*r为指向尾部的结点*/
for(i=0;i<n;i++)
{
p=(Node*)malloc(sizeof(Node));/*生成新结点*/
p->data=rand()%100+1;/*随机生成100以内的数字*/
r->next=p;/*将表尾终端结点的指针指向新结点*/
r=p;/*将当前的新结点定义为表尾终端结点*/
}
r->next=NULL;/*表示当前链表结束*/
}
intmain()
{
LinkListL;
ElemTypee;
Statusi;
intj,k;
i=InitList(&L);
printf("初始化L后:ListLength(L)=%d ",ListLength(L));
for(j=1;j<=5;j++)
i=ListInsert(&L,1,j);
printf("在L的表头依次插入1~5后:L.data=");
ListTraverse(L);
printf("ListLength(L)=%d ",ListLength(L));
i=ListEmpty(L);
printf("L是否空:i=%d(1:是0:否) ",i);
i=ClearList(&L);
printf("清空L后:ListLength(L)=%d ",ListLength(L));
i=ListEmpty(L);
printf("L是否空:i=%d(1:是0:否) ",i);
for(j=1;j<=10;j++)
ListInsert(&L,j,j);
printf("在L的表尾依次插入1~10后:L.data=");
ListTraverse(L);
printf("ListLength(L)=%d ",ListLength(L));
ListInsert(&L,1,0);
printf("在L的表头插入0后:L.data=");
ListTraverse(L);
printf("ListLength(L)=%d ",ListLength(L));
GetElem(L,5,&e);
printf("第5个元素的值为:%d ",e);
for(j=3;j<=4;j++)
{
k=LocateElem(L,j);
if(k)
printf("第%d个元素的值为%d ",k,j);
else
printf("没有值为%d的元素 ",j);
}
k=ListLength(L);/*k为表长*/
for(j=k+1;j>=k;j--)
{
i=ListDelete(&L,j,&e);/*删除第j个数据*/
if(i==ERROR)
printf("删除第%d个数据失败 ",j);
else
printf("删除第%d个的元素值为:%d ",j,e);
}
printf("依次输出L的元素:");
ListTraverse(L);
j=5;
ListDelete(&L,j,&e);/*删除第5个数据*/
printf("删除第%d个的元素值为:%d ",j,e);
printf("依次输出L的元素:");
ListTraverse(L);
i=ClearList(&L);
printf(" 清空L后:ListLength(L)=%d ",ListLength(L));
CreateListHead(&L,20);
printf("整体创建L的元素(头插法):");
ListTraverse(L);
i=ClearList(&L);
printf(" 删除L后:ListLength(L)=%d ",ListLength(L));
CreateListTail(&L,20);
printf("整体创建L的元素(尾插法):");
ListTraverse(L);
return0;
}