㈠ 用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;
}