当前位置:首页 » 编程语言 » c语言单链表代码解析
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言单链表代码解析

发布时间: 2023-06-18 20:57:21

‘壹’ 用c语言编程实现单链表的基本操作

运行结果如下:


完整代码如下:


#include<stdio.h>

#include<stdlib.h>


typedef struct LNode

{

char data;

LNode *next;

}* LNodePtr;


LNodePtr CreateList()

{

//初始化头节点

LNodePtr head = (LNodePtr)malloc(sizeof(LNode));

head->data = 0;

head->next = NULL;


LNodePtr tNode;//临时节点

char data;

while(true)

{

scanf("%c",&data);

if(data == '' || data == ' ' || data == ' ' || data == ' ')

{

continue;

}

if(data == '!')//输入感叹号停止插入节点

{

printf("输入链表元素结束。 ");

break;

}

if(data >= 'A' && data <= 'Z')

{

tNode = (LNodePtr)malloc(sizeof(LNode));

tNode->data = data; /* 数据域赋值 */

tNode->next = head->next;

head->next = tNode;

}

else

{

printf("输入字符需为大写字母。 ");

}

}

return head;

}


/**

加密函数,加密的方式为链接head的所有节点前移offset位,但是不支持offset比链表的节点数多

@param head 链表头节点

@param offset 节点前移的位数

*/

void EncryptList(LNodePtr head,int offset)

{

LNodePtr tNode = head->next;

int i;

for(i = 0; i < offset; i++)

{

if(tNode->next != NULL)

{

tNode = tNode->next;

}

}

if(i == offset)

{

LNodePtr newHead = tNode;

LNodePtr tail = tNode;

while (tail->next != NULL)

{

tail = tail->next;

}

tail->next = head->next;

while(tNode->next != NULL)

{

if(tNode->next != newHead)

{

tNode = tNode->next;

}

else

{

tNode->next = NULL;

break;

}

}

head->next = newHead;

}

else

{

printf("不支持移动");

}

}


void ListPrint(LNodePtr head)

{

if(head->next != NULL)

{

LNodePtr tNode = head->next;

while (tNode->next != NULL)

{

printf("%c ",tNode->data);

tNode = tNode->next;

}

printf("%c",tNode->data);

}

}


int main()

{

LNodePtr list = CreateList();

printf(" 创建的链表如下: ");

ListPrint(list);

EncryptList(list,3);

printf(" 所有节点前移了3位之后的链表如下: ");

ListPrint(list);

printf(" ");

return 0;

}


如果看不懂代码可以问我

‘贰’ 求C语言单链表 源代码

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct people
{
char name[10];
int age;
struct people * next;
};
int main()
{
struct people * head=NULL;
struct people * prev , * current;
int flag=1;
while(flag!=0)
{
printf("请输入学生姓名,年龄:(年龄输入0结束所有输入工作) ");
current=(struct people *)malloc(sizeof(struct people));
if(head==NULL)
head=current;
else
prev->next=current;
current->next=NULL;
scanf("%s",&current->name);
scanf("%d",&current->age);
prev=current;
flag=current->age;
}
printf("Output: ");
if(head==NULL)
printf("无资料。 ");
else
{
current=head;
while(current->next!=NULL)
{
printf("姓名:%s 年龄:%d ",current->name,current->age);
current=current->next;
}
}
}


至于排序,断开旧链表,将前后指针链接到新的节点就好

如果还有问题欢迎再问哈

‘叁’ C语言链表原理

每个节点有一个数据域num保存该节点的数据,以及一个next域指向下一个节点的地址。假设某时刻指针p指向链表头结点,通过一个循环不停地将p赋值为p指向的节点的next域的值,即该节点的下一个节点的地址,即可遍历整个列表。

‘肆’ c语言单链表代码

#include<stdio.h>

#include<stdlib.h>

typedefstructnode

{

intdata;

structnode*next;

}node,*link;

linkcreate(linkhead)

{

inttemp;

linkp,q;

q=head=p=(node*)malloc(sizeof(node));

while(scanf("%d",&temp),temp)

{

p->data=temp;

if(p!=head)

{

q->next=p;

q=p;

}

p=(node*)malloc(sizeof(node));

}

q->next=NULL;

returnhead;

}

voidshow(linkhead)

{

linkp=head;

while(p)

{

printf("%d",p->data);

p=p->next;

}

}

voidmain()

{

linkhead;

head=create(head);

show(head);

}