赞
踩
最近复习到链表,感觉什么都忘了,指针、二级指针,于是今天下午,按照自己想法就手写了一个带头结点的链表,回忆回忆。里面用到了二级指针,实现了链表初的始化,头插法、尾插法创建链表,在链表的第i个位置插入x的元素,单链表的删除,在链表中删除值为x的元素,遍历链表。
贴码如下:
- #include<stdio.h>
- #include<stdlib.h>
-
- typedef struct Node{
-
- int data;
- struct Node* next;
-
- }Node,*Linkedlist;
-
- //链表初始化
- //头插法
- //尾插法
- //单链表的插入,在链表的第i个位置插入x的元素
- //单链表的删除,在链表中删除值为x的元素
- //遍历链表
-
-
- //链表初始化
- void initList(Linkedlist* pHead){
- Node* p;
- p = (Node*)malloc(sizeof(Node));
- if(p==NULL){
- printf("申请内存空间失败!");
- }
- else{
- p->next=NULL;
- printf("创建头结点成功!\n");
- *pHead=p;
- }
- }
-
-
-
- //头插法创建链表
- void NodeHeadCreate(Linkedlist p){
- if(p==NULL){
- printf("链表未初始化!");
- }
- int t;
- Node* q;
-
- printf("头插法创建链表:");
- while(1){
- scanf("%d",&t);
- if(t==-1){
- break;
- }
- q = (Node*)malloc(sizeof(Node));
- q->next = p->next;
- q->data = t;
- p->next = q;
- }
- }
-
-
- //尾插法创建链表
- void NodeRearCreate(Linkedlist p){
- if(p==NULL){
- printf("链表未被初始化!");
- }
-
- int t,d;
-
- Node* rear;
- Node* q;
- printf("尾插法创建链表:");
- while(1){
- scanf("%d",&t);
- if(t==-1){
- break;
- }
- q = (Node*)malloc(sizeof(Node));
- q->data = t;
- q->next = NULL;
- rear->next = q;
- rear = q;
- }
- }
-
-
-
- //单链表的插入,在链表的第i个位置插入x的元素
- void LinkedlistInsertNode(Linkedlist pHead,int i,int x){
-
- int k=0;
- Node* p;
- Node* q;
- p=pHead;
-
- while(p->next!=NULL){
- k++;
- if(k==i){
- q = (Node*)malloc(sizeof(Node));
- q->next=p->next;
- q->data=x;
- p->next=q;
- break;
- }
-
- p=p->next;
- }
- }
-
-
-
- //单链表的删除,在链表中删除值为x的元素
- void DeleteLinkedValue(Linkedlist p,int x){
- Node* q;
- q = p;
- int k = 0;
- bool flag = false;
- while(p->next!=NULL){
- if(p->next->data==x){
- q = p->next;
- p->next=q->next;
- free(q);
- flag = true;
- k++;
- }
- if(p->next!=NULL){//注意空指针异常,也可以放在前面
- p = p->next;
- }
-
- }
- if(flag){
- printf("成功删除节点:%d,并且存在:%d个\n",x,k);
- }
- else
- {
- printf("链表中不存在节点:%d\n",x);
- }
- }
-
-
-
- //打印链表
- void PrintLinklist(Linkedlist p){
- if(p->next!=NULL){
- printf("打印链表的值:");
- }
- while(p->next!=NULL){
- p=p->next;
- printf("%4d",p->data);
- }
- printf("\n");
-
- }
-
- int main(){
- Linkedlist list;
- Node* pHead;
- initList(&pHead);
- // NodeHeadCreate(pHead);
- NodeRearCreate(pHead);
- if(pHead->next==NULL){
- printf("请按头插法或尾插法创建链表失败!");
- }
- PrintLinklist(pHead);
-
- //请输入要删除的i值
- int i;
- printf("请输入要删除的i值:");
- scanf("%d",&i);
- DeleteLinkedValue(pHead,i);
-
- printf("删除后的链表值为:");
- PrintLinklist(pHead);
-
- int j,k;
- printf("请输入要在第i个位置插入的值x:");
- scanf("%d%d",&j,&k);
- LinkedlistInsertNode(pHead,j,k);
- printf("插入k值后的链表值为:");
- PrintLinklist(pHead);
-
-
- return 0;
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。