Posted on 2012-03-01 11:49
hoshelly 閱讀(412)
評論(0) 編輯 收藏 引用 所屬分類:
DS && Algorithm
要求:從終端輸入一組整數(shù)(大于10),以0作為結(jié)束標(biāo)志,將這一組整數(shù)存放在一個鏈表中(結(jié)束標(biāo)志0不包括在內(nèi)),打印出該鏈表中的值。然后刪除該鏈表的第5個元素,打印出刪除后的結(jié)果。最后在內(nèi)存中釋放掉該鏈表。
源程序如下:
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
typedef int ElemType;
typedef struct node{
ElemType data;
struct node *next;
}LNode,*LinkList;
LinkList GreatLinkList(int n){
LinkList p,r,list=NULL;
ElemType e;
int i;
for(i=1;i<=n;i++)
{
scanf("%d",&e);
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
p->next=NULL;
if(!list)
list=p; //如果list為空,則說明本次生成的結(jié)點(diǎn)為第一個結(jié)點(diǎn),將p賦給list
else
r->next=p;//否則將p賦給r->next,這里r永遠(yuǎn)指向原先鏈表的最后一個結(jié)點(diǎn),也就是要插入結(jié)點(diǎn)的前一個結(jié)點(diǎn)
r=p;
}
return list;//返回鏈表頭指針
}
void insertList(LinkList *list,LinkList q,ElemType e)
{
LinkList p;
p=(LinkList)malloc(sizeof(LNode));
p->data=e;
if(!*list){ //當(dāng)鏈表為空時(shí),將p賦給list,p的next域的值置為空
*list=p;
p->next=NULL;
}
else
{
p->next=q->next;//q為插入指針指向的結(jié)點(diǎn)
q->next=p;
}
}
void delLink(LinkList *list,LinkList q){
LinkList r;
if(q==*list)//如果刪除第一個結(jié)點(diǎn)
{
*list=q->next;
free(q);
}
else //刪除其他結(jié)點(diǎn)
{
for(r=*list;r->next!=q;r=r->next);//當(dāng)q所指向的結(jié)點(diǎn)的前驅(qū)結(jié)點(diǎn)的指針未知時(shí),需要先通過鏈表頭指針list遍歷鏈表,
//找到q的前驅(qū)結(jié)點(diǎn)的指針,并把該指針賦值給指針變量r
if(r->next!=NULL){
r->next=q->next;
free(q);
}
}
}
void destroyLinkList(LinkList *list){
LinkList p,q;
p=*list;
while(p)//循環(huán)釋放掉每個鏈表結(jié)點(diǎn)
{
q=p->next;
free(p);
p=q;
}
*list=NULL;//將該鏈表完全置空,防止list變成野指針
}
void main()
{
int e,i;
LinkList l,q;
q=l=GreatLinkList(1);//創(chuàng)建鏈表一個結(jié)點(diǎn),q和l指向該結(jié)點(diǎn)
scanf("%d",&e);
while(e) //循環(huán)輸入數(shù)據(jù),同時(shí)插入新生成的結(jié)點(diǎn)
{
insertList(&l,q,e);
q=q->next;
scanf("%d",&e);
}
q=l;
printf("The content of the linklist\n");
while(q) //輸出鏈表中的內(nèi)容
{
printf("%d ",q->data);
q=q->next;
}
q=l;
printf("\nDelete teh fifthe element\n");
for(i=0;i<4;i++)
{
q=q->next;
}//將指針q指向鏈表的第5個元素
delLink(&l,q);
q=l;
while(q)
{
printf("%d ",q->data);
q=q->next;
}
destroyLinkList(&l);
getche();//輸入后立即從控制臺取字符,不以回車為結(jié)束(帶回顯)
}