ps:该链表数据插入为尾插法
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#define LEN sizeof(struct stu)
struct stu {
int data;
struct stu *next;
};
struct stu* creat(int n) {
struct stu *p1,*p2,*head;
for(int i=1; i<=n; i++) {
p1=(struct stu*)malloc(LEN);
printf("Enter data:");
scanf("%d",&p1->data);
if(i==1) {
head=p1;
}
else
p2->next=p1;
p1->next=NULL;
p2=p1;
}
return head;
}
void print(struct stu *head) {
struct stu *p;
p=head;
while(p!=NULL) {
printf("%5d",p->data);
p=p->next;
}
}
struct stu* del(struct stu *head,int n) {
struct stu *p1,*p2;
p1=head;
while(p1->data!=n && p1->next!=NULL) {
p2=p1;
p1=p1->next;//定位
}
if(n==p1->data)
{
if(p1==head) head=p1->next;
else p2->next=p1->next;
printf("delete %d \n",n);
free(p1);
} else
printf("%d can not be find",n);
return head;
}
struct stu* insert(struct stu *head) {
struct stu *p0,*p1,*p2;
p1=(struct stu*)malloc(LEN);
printf("\nEnter data");
scanf("%d",&p1->data);
//尾部插入
p0=head;
while(p0->next!=NULL){
p0=p0->next;
}
p0->next=p1;
p1->next=NULL;
return head;
}
void menu(){
printf("\n*****************************\n");
printf("\n***1.creat 2.delete****\n");
printf("\n***3.insert 4.print*****\n");
printf("\n***5.over *************\n");
printf("\n*****************************\n");
}
int main() {
struct stu *head;
int n;
int input;
do{
menu();
printf("\nEnter choice:");
scanf("%d",&input);
switch(input){
case 1:
printf("\nEnter num:");
scanf("%d",&n);
head=creat(n);
print(head);
break;
case 2:
printf("\n输入要删除的数据:");
scanf("%d",&n);
del(head,n);
print(head);
break;
case 3:
insert(head);
print(head);
break;
case 4:
print(head);
break;
default: printf("\nwrong choice");
}
}while(input!=5);
return 0;
}
链表的建立是建立在有一个头指针的基础上,将数据节点一个一个串联起来
重复开辟的过程,得到链表