寫於 2015-06-10 13:17:42
#include<stdio.h>
#include<stdlib.h>
typedef int Status;
typedef int Elemtype;
typedef struct LNode{
Elemtype data;
struct LNode *next;
}*LinkList;
Status InitList(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
L->next=NULL;
return 1;
}
Status DestoryList(LinkList &L){
LNode *p,*q;
p=L;
while(p->next){
q=p->next;
free(p);
p=q;
}
return 1;
}
Status IsListEmpty(LinkList &L){
if(!L->next) return 1;
return 0;
}
Status ListLength(LinkList &L){
LNode *p;
p=L;
int i=0;
while(p->next){
p=p->next;
i++;
}
return i;
}
Status GetElem(LinkList &L,int i,Elemtype &e){
LNode *p;
int j=0;
p=L;
while(p->next&&j<i-1){
p=p->next;
j++;
}
if(!(p->next)||j>i-1) return 0;
e=p->data;
return 1;
}
Status LocateElem(LinkList &L,Elemtype e){
LNode *p;
p=L;
int i=0;
while(p->next){
i++;
if(p->data==e)
return i;
p=p->next;
}
return 0;
}
Status PriorElem(LinkList &L,Elemtype cur_e,Elemtype &pre_e){
LNode *p,*q;
p=L;
int i=0;
while(p->next){
q=p;
i++;
p=p->next;
if(p->data==cur_e) {
q->data=pre_e;
return 1;
}
}
return 0;
}
Status NextElem(LinkList &L,Elemtype cur_e,Elemtype &next_e){
LNode *p;
p=L;
int i=0;
while(!p->next){
i++;
if(p->data==cur_e){
p->next->data=next_e;
return 1;
}
p=p->next;
}
return 0;
}
Status Listsert(LinkList &L,int i,Elemtype e){
LNode *p;
int j=0;
p=L;
while(p&&j<i-1){
p=p->next;
j++;
}
if(!p||j>i-1) return 0;
LNode *s;
s=(LinkList)malloc(sizeof(LNode));
s->data=e; s->next=p->next;
p->next=s;
return 1;
}
Status ListDelete(LinkList &L,int i,Elemtype &e){
LNode *p,*q;
int j=0;
p=L;
while(p->next&&j<i-1){
p=p->next;
j++;
}
if(!(p->next)||j>i-1) return 0;
q=p->next; p->next=q->next;
e=q->data; free(q);
return 1;
}
Status PrintList(LinkList &L){
LNode *p;
p=L;
while(p->next){
p=p->next;
printf("%d\n",p->data);
}
return 1;
}
int main(){
LinkList l;
InitList(l);
int set,isclose,locate;
Elemtype e,cur_e,pre_e,next_e;
/*student student[10];
for(int i=0;i<2;i++){
scanf("%s %d",student[i].name,&student[i].score);
Push(s,student[i]);
}
PrintStack(s);
*/
while(1){
set=0;
printf(" 1.插入元素\n 2.刪除指定位置元素並輸出\n 3.輸出鏈表的長度\n 4.銷燬鏈表\n 5.在指定元素前插入一個元素 \n 6.查詢該鏈表是否爲空 \n 7.輸出位置元素\n 8.輸出整個鏈表中的所有元素\n 9.建立鏈表(在銷燬後重建)\n");
scanf("%d",&set);
switch(set){
case 1:printf("請輸入元素及要插入的位置,用空格分隔\n");scanf("%d %d",&e,&locate);if(Listsert(l,locate,e)) printf("插入成功\n");else printf("插入失敗\n"); break;
case 2:printf("請輸入要刪除的位置\n");scanf("%d",&locate);if(ListDelete(l,locate,e))printf("%d\n",e);else printf("鏈表裏無元素\n");break;
case 3:printf("%d\n",ListLength(l));break;
case 4:if(DestoryList(l)) printf("銷燬成功\n");break;
case 5:printf("請輸入指定的元素和要插入的元素\n");scanf("%d %d",&cur_e,&pre_e); if(PriorElem(l,cur_e,pre_e)) printf("插入成功\n");break;
case 6:if(IsListEmpty(l)) printf("鏈表爲空\n"); else printf("鏈表不爲空\n");break;
case 7:printf("請輸入要輸出的位置\n");scanf("%d",&locate);if(GetElem(l,locate,e))printf("%d\n",e);else printf("鏈表裏無元素\n");break;
case 8:PrintList(l);break;
case 9:InitList(l);break;
}
printf("結束輸入0, 輸入其他任意鍵繼續\n");
scanf("%d",&isclose);
if(!isclose) break;
}
return 0;
}
2年前寫的。可能出錯