主体代码
#include<stdio.h>
#include<stdlib.h>
typedef struct _node{
int value;
struct _node *pointer;
}node;
typedef struct _package{
node *head;
}package;
void linked_list(package *package); //创造链表
void print_linkedlist(package *package); //输出链表中的每个元素
void del_an_unit(package *package); // 删除列表中的某个元素
int main(){
package package = {NULL};
linked_list(&package);
print_linkedlist(&package);
del_an_unit(&package);
print_linkedlist(&package);
return 0;
}
void linked_list(package *package){
int n;
scanf("%d",&n);
while(n>=0){
node *p = (node*)malloc(sizeof(node));
p->value = n;
p->pointer = NULL;
if(package->head == NULL)
//这句判断保证了初始化时赋值给package->head的p,一定是第一个产生的p。
//因为如果是第二次的话,package->head已经不是NULL了。
{
package->head = p;
}else{
node *next = package->head;
while(next->pointer != NULL){
next = next->pointer;
}
next->pointer = p;
}
scanf("%d",&n);
}
}
void print_linkedlist(package *package){
node *temp;
for(temp=package->head;temp;temp=temp->pointer){
printf("%d\t",temp->value);
}
printf("\n");
}
void del_an_unit(package *package){
int n = -1;
int sign = 0;
printf("请输入想从链表中删除的一个数据\n");
do{
node *temp = package->head;
scanf("%d",&n);
for(temp=package->head;temp;temp=temp->pointer){
//必须有一个指针跟在temp屁股后面
node *follow = package->head;
while(follow->pointer != temp && follow != temp ){
follow = follow->pointer;
}
if(temp->value == n){
//当被删除的数据是首位时,就要把head往后移动一个单元。否则package->pointer被释放之后
// (package->head)->pointer是个啥呢? (package->head)都不存在了。
if(temp == package->head){
package->head = temp->pointer;
free(temp);
temp = package->head;
}else{
follow->pointer = temp->pointer;
//当temp要被释放的时候,使本来前一位指向temp跳过temp,即指向temp->pointer
free(temp);
temp = follow;
//然后让temp=follow重新接上来
}
sign = 1;
}
}
if(n != -1){
if(sign){
printf("该数据已经删除,请输入另一个想要删除的数,或者输入-1结束。\n");
}else{
printf("列表中并无改数据,请输入另一个想删除的数。或者输入-1结束。\n");
}
}
}while(n!=-1);
}
对于链表生成,我的一些理解
警告:以下为手写稿!
——