链表的建立、插入和删除
2007-05-03 11:41:50 来源:WEB开发网7.4.2 单链表的插入与删除
在链表这种特殊的数据结构中,链表的长短需要根据具体情况来设定,当需要保存数据时向系统申请存储空间,并将数据接入链表中。对链表而言,表中的数据可以依此接到表尾或连结到表头,也可以视情况插入表中;对不再需要的数据,将其从表中删除并释放其所占空间,但不能破坏链表的结构。这就是下面将介绍的链表的插入与删除。
1. 链表的删除
在链表中删除一个节点,用图7 - 4描述如下:
[例7-6] 创建一个学生学号及姓名的单链表,即节点包括学生学号、姓名及指向下一个节点的指针,链表按学生的学号排列。再从键盘输入某一学生姓名,将其从链表中删除。
首先定义链表的结构:
struct
从图7 - 4中看到,从链表中删除一个节点有三种情况,即删除链表头节点、删除链表的中
间节点、删除链表的尾节点。题目给出的是学生姓名,则应在链表中从头到尾依此查找各节
点,并与各节点的学生姓名比较,若相同,则查找成功,否则,找不到节点。由于删除的节
点可能在链表的头,会对链表的头指针造成丢失,所以定义删除节点的函数的返回值定义为
返回结构体类型的指针。
struct node *delet(head,pstr)以/*he a d 为头指针,删除ps t r 所在节点*/
struct node *head;
char *pstr;
{
struct node *temp,*p;
t e m p = h e a d ; / * 链表的头指针* /
if (head==NULL) / *链表为空* /
printf("\nList is null!\n");
else /*非空表* /
{
t e m p = h e a d ;
while (strcmp(temp->str,pstr)!=0&&temp->next!=NULL)
/ * 若节点的字符串与输入字符串不同,并且未到链表尾* /
{
p = t e m p ;
t e m p = t e m p - > n e x t ; / * 跟踪链表的增长,即指针后移* /
}
if(strcmp(temp->str,pstr)==0 ) / *找到字符串* /
{
if(temp==head) { / * 表头节点* /
printf("delete string :%s\n",temp->str);
h e a d = h e a d - > n e x t ;
f r e e ( t e m p ) ; / *释放被删节点* /
}
e l s e
{
p->next=temp->next; /表*中节点*/
printf("delete string :%s\n",temp->str);
f r e e ( t e m p ) ;
}
}
else printf("\nno find string!\n");没/找* 到要删除的字符串*/
}
r e t u r n ( h e a d ) ; / *返回表头指针* /
}
2. 链表的插入
首先定义链表的结构:
struct
{
int num; /*学生学号* /
char str[20]; /*姓名* /
struct node *next;
} ;
在建立的单链表中,插入节点有三种情况,如图7 - 5所示。
插入的节点可以在表头、表中或表尾。假定我们按照以学号为顺序建立链表,则插入的节点依次与表中节点相比较,找到插入位置。由于插入的节点可能在链表的头,会对链表的头指针造成修改,所以定义插入节点的函数的返回值定义为返回结构体类型的指针。节点的
插入函数如下:
struct node *insert(head,pstr,n) / *插入学号为n、姓名为p s t r 的节点* /
struct node *head; / *链表的头指针* /
char *pstr;
int n;
{
struct node *p1,*p2,*p3;
p1=(struct node*)malloc(sizeof(struct node))分;配/*一个新节点*/
s t r c p y ( p 1 - > s t r , p s t r ) ; / * 写入节点的姓名字串* /
p 1 - > n u m = n ; / * 学号* /
p 2 = h e a d ;
if (head==NULL) / * 空表* /
{
head=p1; p1->next=NULL;/ *新节点插入表头* /
}
e l s e
{ /*非空表* /
while(n>p2->num&&p2->next!=NULL)
/ *输入的学号小于节点的学号,并且未到表尾* /
{
p 3 = p 2 ;
p 2 = p 2 - > n e x t ; / * 跟踪链表增长* /
}
if (n<=p2->num) / *找到插入位置* /
if (head==p2) / * 插入位置在表头* /
{
h e a d = p 1 ;
p 1 - > n e x t = p 2 ;
}
e l s e
{ /*插入位置在表中* /
p 3 - > n e x t = p 1 ;
p 1 - > n e x t = p 2 ;
}
e l s e
{ /*插入位置在表尾* /
p 2 - > n e x t = p 1 ;
p 1 - > n e x t = N U L L ;
}
}
r e t u r n ( h e a d ) ; / * 返回链表的头指针* /
}
更多精彩
赞助商链接