学习随记一——用C语言实现单链表的头插法和尾插法

## 用c语言实现单链表的头插法和尾插法
1. 创建结点结构体
——第一部分是数据域----存储数据
——第二部分是指针域----连接结点
例:

```c
typedef struct Listnode{
int data; //数据域
struct Listnode* next; //指针域
}ListNode;
```

2. 封装创建链表的函数

```c
ListNode* createlist1(){ //头插法实现链表创建
int i; //存储数据
ListNode *head,*p; //头指针和工作指针
head=NULL; //链表开始为空
printf("请开始输入数据,结束输入输入-1值即可\n");
scanf("%d",&i);
while(i!=-1){
p=(ListNode*)malloc(sizeof(ListNode)); //创建新结点
p->data=i; //将值赋给新结点的数据域中
p->next=head; //头插法生成的第一个结点是链表的最后一个结点
head=p; //头指针指向新生成的结点
scanf("%d",&i);
}
return head;
}
```

```c
ListNode* createlist2(){ //尾插法实现
int i; //存储数据
ListNode *head,*p,*r; //因为要保留头指针的位置方便操作所以要一个中间指针p
head=NULL;
printf("请开始输入数据,输入-1结束\n");
scanf("%d",&i);
while(i!=-1){
r=(ListNode*)malloc(sizeof(ListNode)); //为新结点申请空间
r->data=i; //将数据存入数据域中
if(head==NULL){ //这步操作主要是为了保留头指针地址
head=r;
}else{
p->next=r; //连接结点
}
p=r;
scanf("%d",&i);
}
if(p!=NULL) p->next=NULL; //防止野指针
return head;
}
```

1. 主函数

```c
int main(void){
ListNode *p,*q;
int choice;
printf("请选择用头插法创建单链表还是尾插法创建单链表,头插法选1,尾插法选2\n");
scanf("%d",&choice);
getchar();
if(choice==1){
q=CreateList1(); //头插法创建单链表
}else if(choice==2){
q=CreateList2(); //尾插法创建单链表
}else{
printf("输入错误,程序终止\n");
exit(-1);
}
while(q){
printf("%c",q->data); //输出单链表结点数据
p=q->next; //p为q的后继点
free(q); //释放q结点所占内存
q=p;
}
printf("\n");
return 0;
}
```

 

posted @ 2021-04-01 11:27  空大小鱼人  阅读(364)  评论(0)    收藏  举报