/****************************************************************
該程序?qū)崿F(xiàn)結(jié)點(diǎn)的刪除。
其中void *del_node(TYM *head,int pos,int len)函數(shù)用于刪除結(jié)
點(diǎn),head為需要?jiǎng)h除結(jié)點(diǎn)的鏈表、pos為結(jié)點(diǎn)的位置、len為需要?jiǎng)h除
的長度。
****************************************************************/
#include <stdio.h>
#include <stdlib.h>
typedef struct stu //定義TYM類型
{
char name[20];
int num;
struct stu *next;
}TYM;
void *del_node(TYM *head,int pos,int len) //刪除結(jié)點(diǎn)指針函數(shù)
{
int i;
TYM *p,*q;
if(pos==1) //如果刪除的位置是首地址
{
for(i=0;i<len;i++) //刪除len個(gè)結(jié)點(diǎn)
{
p = head; //使p指向head
head = head->next; //使head指向下一個(gè)結(jié)點(diǎn)
free(p); //釋放p指向的結(jié)點(diǎn)
}
}
else
{
for(p=head,i=1;i<pos-1;i++) //當(dāng)pos不是首地址時(shí),找到pos的位置
{
p = p->next; //使p指向下一個(gè)結(jié)點(diǎn),直到第pos個(gè)結(jié)點(diǎn)為止
}
for(i=0;i<len;i++) //刪除len個(gè)結(jié)點(diǎn)
{
q = p->next; //使q指向p的下一個(gè)結(jié)點(diǎn)
p->next = q->next; //將q的下一個(gè)結(jié)點(diǎn)的地址傳給p的next
free(q); //釋放q指向的結(jié)點(diǎn)
}
}
return head; //返回首地址
}
void freeall(TYM *head) //釋放函數(shù)
{
TYM *p;
for(p=head;p!=NULL;) //釋放結(jié)點(diǎn)直到所有結(jié)點(diǎn)被釋放
{
p = head->next; //使p指向下一個(gè)結(jié)點(diǎn)
free(head); //釋放當(dāng)前結(jié)點(diǎn)
head = p; //使head指向下一個(gè)結(jié)點(diǎn)
}
if(p==NULL) //如果全部釋放
printf("********* Free Success! *********\n");
}
int main()
{
TYM *head,*p,*q;
int i,pos;
head = p = (TYM *)malloc(sizeof(TYM)); //開辟一個(gè)新的空間
printf("*********************************\n");
printf("Please Input :\n");
scanf("%s%d",head->name,&head->num); //對(duì)新空間賦值
for(i=0;i<4;i++) //創(chuàng)建4個(gè)空間
{
q = (TYM*)calloc(1,sizeof(TYM)); //將開辟的空間的首地址賦給q
p->next = q; //將q的值傳遞給p的next成員
p = q; //使p指向q
scanf("%s%d",p->name,&p->num); //對(duì)新空間賦值
p->next = NULL; //使空間的next成員不指向任何方向
}
printf("************ Output *************\n");
for(p=head;p!=NULL;p=p->next) //輸出鏈表
{
printf("%s\t%d\n",p->name,p->num); //輸出當(dāng)前變量的值
}
printf("DELETE......\n");
printf("******** Position & Lenth *******\n");
printf("Position:\t");
scanf("%d",&pos); //輸入刪除結(jié)點(diǎn)的地址
printf("Lenth:\t\t");
scanf("%d",&i); //輸入刪除結(jié)點(diǎn)的個(gè)數(shù)
head = del_node(head,pos,i);
printf("********** Output all ***********\n");
for(p=head;p!=NULL;p=p->next) //輸出經(jīng)刪除后的鏈表
{
printf("%s\t%d\n",p->name,p->num); //輸出當(dāng)前變量的值
}
freeall(head); //釋放鏈表
return 0;
}

****************************************調(diào)試窗口****************************************
|