创建一个链表,10个节点里内容放字符串(单词)把他们链起来。任一单词能插入,删除。计数链表的单词数。放在.h的文件中。
参考代码
#include <stdio.h>
#include <stdlib.h>
typedef struct Link{
char *str;
struct Link *next;
}link;
link * initLink(char *sa[], int n);
link * insertElem(link * p, char *str, int add);
link * delElem(link * p,int add);
int count(link *p);
void display(link *p);
int main() {
char *sa[] ={"aaa","bbb","ccc","ddd","eee","fff","ggg","hhh","iii","jjj"};
printf("初始化链表为:\n");
link *p=initLink(sa,10);
display(p);
printf("在第4的位置插入zzz:\n");
p=insertElem(p, "zzz", 4);
display(p);
printf("删除元素3:\n");
p=delElem(p, 3);
display(p);
printf("统计元素个数:%d\n",count(p));
return 0;
}
link * initLink(char *sa[], int n){
link * p=(link*)malloc(sizeof(link));//创建一个头结点
link * temp=p;//声明一个指针指向头结点,用于遍历链表
for (int i=0; i<n; i++) {
link *a=(link*)malloc(sizeof(link));
a->str=sa[i];
a->next=NULL;
temp->next=a;
temp=temp->next;
}
return p;
}
link * insertElem(link * p, char *str, int add){
link * temp=p;//创建临时结点temp
//首先找到要插入位置的上一个结点
for (int i=1; i<add; i++) {
if (temp==NULL) {
printf("插入位置无效\n");
return p;
}
temp=temp->next;
}
//创建插入结点c
link * c=(link*)malloc(sizeof(link));
c->str=str;
//向链表中插入结点
c->next=temp->next;
temp->next=c;
return p;
}
link * delElem(link * p,int add){
link * temp=p;
//遍历到被删除结点的上一个结点
for (int i=1; i<add; i++) {
temp=temp->next;
}
link * del=temp->next;//单独设置一个指针指向被删除结点,以防丢失
temp->next=temp->next->next;//删除某个结点的方法就是更改前一个结点的指针域
free(del);//手动释放该结点,防止内存泄漏
return p;
}
int count(link *p){
link* temp=p;//将temp指针重新指向头结点
int n = 0;
while (temp->next) {
temp=temp->next;
n++;
}
return n;
}
void display(link *p){
link* temp=p;//将temp指针重新指向头结点
//只要temp指针指向的结点的next不是Null,就执行输出语句。
while (temp->next) {
temp=temp->next;
printf("%s ",temp->str);
}
printf("\n");
}