通过指针实现链表增删改查。
1.首先定义宏以及结构体作为数据结构使用。
#define LEN sizeof(struct student)
struct student{
long num;
float score;
struct student *next;
};
int n;//为全局变量,本文件模块中各函数均可使用它
2.建立动态链表
struct student *create(void){//定义函数,此函数带回一个指向链表头的指针
struct student *head;
struct student *p1,*p2;
n = 0;
p1 = p2 = (struct student *)malloc(LEN);//开辟一个新单元
scanf("%ld,%f",&p1->num, &p1->score);
head = NULL;
while (p1->num!=0) {
n = n+1;
if (n==1) {
head = p1;
}else {
p2->next = p1;
}
p2 = p1;
p1 = (struct student *)malloc(LEN);
scanf("%ld,%f",&p1 -> num,&p1 -> score);
}
p2 -> next = NULL;
return head;
}
3.输出链表
//输出链表
void print(struct student *head){
struct student *p;
printf("Now,These %d records are:\n",n);
p = head;
if (head!=NULL) {
do {
printf("%ld %5.1f\n",p->num,p->score);
p = p->next;
} while (p!=NULL);
}
printf("\n",n);
}
4.删除链表
struct student *del(struct student *head,long num){
struct student *p1,*p2 = nullptr;
if (head==NULL) {
return head;
}
p1 = head;
while (num!=p1->num&&p1->next!=NULL) {//p1指向的不是所要找的结点,并且后面还有结点
p2 = p1;
p1 = p1 -> next;
}
if (num == p1 -> num) {//找到了
if (p1 == head) {
head = p1 -> next;
}else{
p2 ->next = p1 -> next;
}
n = n - 1;
}else {
//找不到该结点
}
return head;
}
5.插入链表
struct student * insert(struct student * head,struct student *stud){
struct student *p0,*p1,*p2 = nullptr;
p1 = head;//使p1指向第一个结点
p0 = stud;//p0指向要插入的结点
if (head == NULL) {//原来的链表是空表
head = p0;//p0指向的结点作为头结点
p0 -> next = NULL;
}else{
while ((p0 -> num > p1 -> num) && (p1 -> next != NULL)) {
p2 = p1;//使p2指向刚才p1指向的结点
p1 = p1 -> next;//p1后移一个结点
}
if (p0 -> num <= p1 -> num) {
if (head == p1) {
head = p0; //插到原来第一个结点之前
}else {
p2 -> next = p0;//插到p2指向的结点之后
}
p0 -> next = p1;
}else{
p1 -> next = p0;//插到最后的结点之后
p0 -> next = NULL;
}
}
n = n + 1;//结点数加1;
return head;
}
6.主函数
int main(int argc, const char * argv[]) {
struct student * head,stu;
long del_num;
printf("input records:(建立链表)\n");
head = create();//建立链表,返回头指针
print(head);//输出全部结点
printf("input the deleted number(删除):\n");
scanf("%ld",&del_num);
head = del(head, del_num);//删除后链表的头地址
print(head);//输出全部结点
printf("input records(插入结点):\n");
scanf("%ld,%f",&stu.num,&stu.score);
head = insert(head, &stu);//插入一个结点,返回头结点地址
print(head);//输出全部结点
return 0;
}
7.测试结果截图