Posted on 2012-03-01 11:49 
hoshelly 阅读(438) 
评论(0)  编辑 收藏 引用  所属分类: 
DS && Algorithm 
			 
			
		 
		要求:从终端输入一组整数(大于10),以0作为结束标志,将这一组整数存放在一个链表中(结束标志0不包括在内),打印出该链表中的值。然后删除该链表的第5个元素,打印出删除后的结果。最后在内存中释放掉该链表。
源程序如下:
#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为空,则说明本次生成的结点为第一个结点,将p赋给list
        else
            r->next=p;//否则将p赋给r->next,这里r永远指向原先链表的最后一个结点,也就是要插入结点的前一个结点
        r=p;
    }
    return list;//返回链表头指针
}
void insertList(LinkList *list,LinkList q,ElemType e)
{
    LinkList p;
    p=(LinkList)malloc(sizeof(LNode));
    p->data=e;
    if(!*list){ //当链表为空时,将p赋给list,p的next域的值置为空
        *list=p;
        p->next=NULL;
    }
    else
    {
        p->next=q->next;//q为插入指针指向的结点
        q->next=p;
    }
}
void delLink(LinkList *list,LinkList q){
    LinkList r;
    if(q==*list)//如果删除第一个结点
    {
        *list=q->next;
        free(q);
    }
    else //删除其他结点
    {
        for(r=*list;r->next!=q;r=r->next);//当q所指向的结点的前驱结点的指针未知时,需要先通过链表头指针list遍历链表,
                                           //找到q的前驱结点的指针,并把该指针赋值给指针变量r
        if(r->next!=NULL){
            r->next=q->next;
            free(q);
        }
    }
}
void destroyLinkList(LinkList *list){
    LinkList p,q;
    p=*list;
    while(p)//循环释放掉每个链表结点
    {
        q=p->next;
        free(p);
        p=q;
    }
    *list=NULL;//将该链表完全置空,防止list变成野指针
}
void main()
{
    int e,i;
    LinkList l,q;
    q=l=GreatLinkList(1);//创建链表一个结点,q和l指向该结点
    scanf("%d",&e);
    while(e) //循环输入数据,同时插入新生成的结点
    {
        insertList(&l,q,e);
        q=q->next;
        scanf("%d",&e);
    }
    q=l;
    printf("The content of the linklist\n");
    while(q) //输出链表中的内容
    {
        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();//输入后立即从控制台取字符,不以回车为结束(带回显)
}