本文主要是介绍有头结点的单向链表,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
有头结点的链表处理起来比较方便,因为头结点的存在,每个节点都可以以同样的方式调用。
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>typedef struct link{char data;struct link * next;
}LinkList;LinkList * setList(); //初始化链表
void setNull(LinkList * ); //置空链表
int getLength(LinkList * ); //求链表长度
LinkList * getData(LinkList * ,int ); //按序号取元素
LinkList * Local(LinkList * , char ); //按值查找
void insert(LinkList * , int , char ); //在第i个位置插入元素
void deleteData(LinkList * , int ); //删除第i个元素元素
void show(LinkList * ); //输出所有元素int main (){LinkList * head = setList();while (1){printf("1. 插入元素\t2.删除元素\n");printf("3. 按值查找\t4.按序号取元素\n");printf("5. 输出所有元素\t6. 退出\n");fflush(stdin);int n ;LinkList * s;scanf("%d",&n);switch(n){case 1: printf("\n输入位置和元素: ");int i ; char ch ;fflush(stdin);scanf("%d",&i);fflush(stdin);scanf("%c",&ch);insert(head,i,ch);break;case 2:printf("\n输入位置: ");int j ;fflush (stdin);scanf("%d",&j);deleteData(head , j );break;case 3:char ch_ ;fflush (stdin);scanf("%c" , &ch_);if (Local(head,ch_) != NULL){printf("\n包含该元素\n");}else{printf("\n不包含该元素\n");}break;case 4:int k ;fflush(stdin);scanf("%d",&k);s = getData(head ,k);if ( s != NULL){printf("\n该元素为: %c \n",s->data );}else{printf("\n不包含该元素\n");}break;case 5:show(head);break;case 6:exit(0);}}return 0;
}LinkList * setList (){LinkList * head = (LinkList *)malloc(sizeof(LinkList));head ->next = NULL;return head ;
}int getLength(LinkList * s ){int length = 0;LinkList * p = s->next;while (p != NULL){p = p->next ;length ++;}return length;
}LinkList * getData(LinkList * s ,int i ){int j = 0;LinkList * p = s ;while (p != NULL && j < i){p = p->next ; j++;}if (p == NULL){printf("\n没有找到该元素\n");}return p;
}LinkList * Local(LinkList * s ,char ch ){LinkList * p = s->next ;while (p != NULL){if (p->data != ch){p = p->next ;}else{break;}}return p;
}void insert (LinkList * s ,int i ,char ch ){int j = 0;LinkList * p = s;while (p != NULL && j < i-1){p = p->next ;j++;}if (p == NULL || i <= 0){printf("\n序号错误\n");}else{LinkList * temp = (LinkList *)malloc(sizeof(LinkList));temp ->data = ch ;temp ->next = p ->next ;p ->next = temp;}
}void deleteData(LinkList * s , int i ){int j = 0 ;LinkList * p = s ;while(p != NULL && j < i-1){p = p->next ;j++;}LinkList * temp = p->next ;p ->next = temp ->next ;free(temp);
}
void show (LinkList * s){LinkList * p = s ->next ;printf("\n链表中的元素有: ");while(p != NULL){printf("%c ",p->data );p = p->next ;}putchar ('\n');
}
这篇关于有头结点的单向链表的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!