版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/twilight_karl/article/details/52966606
有头结点的链表处理起来比较方便,因为头结点的存在,每个节点都可以以同样的方式调用。
#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');
}